HDU 4864 Task(2014多校--贪心)
比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-。-
大意:给你n个机器,m个要完成的任务,每个机器跟任务都有两个属性,机器是最大工作时间跟等级,任务是需要工作的时间跟等级。完成一个任务可以得到500*(工作时间)+2*(等级)的报酬。完成任务的条件是机器的工作时间满足任务的需要,等级要大于等于任务的等级,一个机器只能用一次,一个任务也只能用一个机器去完成。需要进行策略选择,使得完成更多的任务。
思路:开始想的就是贪心,也想到了贪心的时候时间是主导因素,要优先考虑,赛后写的时候是看的标程用的map来实现的。
1 struct node 2 { 3 int time, lev; 4 } a[100010], b[100010]; 5 6 int cmp(node a, node b) 7 { 8 if(a.time == b.time) 9 return a.lev > b.lev; 10 return a.time > b.time; 11 } 12 13 map<int, int> M; 14 int n, m; 15 16 int main() 17 { 18 while(~scanf("%d%d", &n, &m)) 19 { 20 for(int i = 0; i < n; ++i) 21 { 22 scanf("%d%d", &a[i].time, &a[i].lev); 23 } 24 for(int i = 0; i < m; ++i) 25 { 26 scanf("%d%d", &b[i].time, &b[i].lev); 27 } 28 sort(a, a+n, cmp); 29 sort(b, b+m, cmp); 30 M.clear(); 31 int j = 0; 32 int ans1 = 0; 33 long long ans2 = 0; 34 for(int i = 0; i < m; ++i) 35 { 36 while(j < n && a[j].time >= b[i].time) 37 { 38 M[a[j].lev]++; 39 ++j; 40 } 41 map<int, int>::iterator it = M.lower_bound(b[i].lev); 42 if(it != M.end()) 43 { 44 ans1++; 45 ans2 += 500*b[i].time+2*b[i].lev; 46 int t = it->first; 47 M[t]--; 48 if(M[t] == 0) 49 { 50 M.erase(t); 51 } 52 } 53 } 54 printf("%d %I64d\n", ans1, ans2); 55 } 56 57 return 0; 58 }