hdu 4864 Task

http://acm.hdu.edu.cn/showproblem.php?pid=4864

对机器和任务先按时间从大到小排序,时间相同再水平。先选任务找到最小的符合的机器贪心处理就行。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 200000
 5 using namespace std;
 6 
 7 struct node
 8 {
 9     int ti,le;
10     bool operator <(const node &a)const
11     {
12         return (ti>a.ti)||(a.ti==ti&&le>a.le);
13     }
14 }m[maxn],t[maxn];
15 
16 int n,m1;
17 int c[maxn];
18 
19 int main()
20 {
21     while(scanf("%d%d",&n,&m1)!=EOF)
22     {
23         memset(c,0,sizeof(c));
24         for(int i=0; i<n; i++)
25         {
26             scanf("%d%d",&m[i].ti,&m[i].le);
27         }
28         for(int i=0; i<m1; i++)
29         {
30             scanf("%d%d",&t[i].ti,&t[i].le);
31         }
32         sort(m,m+n);
33         sort(t,t+m1);
34         __int64 sum=0;
35         int j=0;
36         int ans=0;
37         for(int i=0; i<m1; i++)
38         {
39             while(j<n&&m[j].ti>=t[i].ti)
40             {
41                 c[m[j].le]++;
42                 j++;
43             }
44             for(int k=t[i].le; k<=200; k++)
45             {
46                 if(c[k])
47                 {
48                     c[k]--;
49                     ans++;
50                     sum+=(500*t[i].ti+2*t[i].le);
51                     break;
52                 }
53             }
54         }
55         printf("%d %I64d\n",ans,sum);
56     }
57     return 0;
58 }
View Code
posted @ 2014-07-23 11:10  null1019  阅读(136)  评论(0编辑  收藏  举报