【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=4864
【算法】
贪心
不妨将两个数组分别按x从大到小排序
然后枚举每件物品,选择x值大于该物品的且y值最小的机器对它进行修理
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 100010 #define MAXP 110 int n,m,i,j,pos; long long ans,money; int cnt[MAXP]; struct info { long long x,y; } a[MAXN],b[MAXN]; inline bool cmp(info a,info b) { return (a.x != b.x) ? a.x > b.x : a.y > b.y; } int main() { while (scanf("%d%d",&n,&m) != EOF) { money = ans = 0; memset(cnt,0,sizeof(cnt)); for (i = 1; i <= n; i++) scanf("%lld%lld",&a[i].x,&a[i].y); for (i = 1; i <= m; i++) scanf("%lld%lld",&b[i].x,&b[i].y); sort(a+1,a+n+1,cmp); sort(b+1,b+m+1,cmp); pos = 1; for (i = 1; i <= m; i++) { while (pos <= n && a[pos].x >= b[i].x) { cnt[a[pos].y]++; pos++; } for (j = b[i].y; j <= MAXP; j++) { if (cnt[j]) { cnt[j]--; ans++; money += 500 * b[i].x + 2 * b[i].y; break; } } } printf("%lld %lld\n",ans,money); } return 0; }