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 }