HDU 4864 Task(2014多校--贪心)

Task

 

比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-。-

大意:给你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 }
HDU 4864
posted @ 2014-07-23 21:05  GLSilence  阅读(258)  评论(0编辑  收藏  举报