首页 > 代码库 > hdu 4864 Task

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)const11     {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