hdu4864
链接:点击打开链接
题目要求:
一共有n个任务,m台机器,每个任务有他的完成所需时间和难度等级,每台机器也有最长工作时间和等级,一个任务只能一台机器做,一台机器只能用在一个任务上。每完成一个任务,可得到r(i)的收益。求最多能做几个任务,如果个数一样多,则求最大收益。
题目思路:
设结构体数组ma[ ],ta[ ],因为r(i)=ta[i].t*500+ta[i].l*2,ta[i].l范围为0~100,则不管多高也不会比多一秒时间高,所以将任务数组按时间从大到小排列,时间相同时按等级从大到小排列(先解决难的)。之后在每个任务遍历,将机器时间比当前任务时间大时记录机器等级,最后选取记录的机器中能解决的等级最低的,因为虽然下面的时间都能满足前面的时间,但是下面的等级可能会更大,所以要把更大的留给后面的。
代码:
#include<iostream> #include<algorithm> #include<cstring> using namespace std; struct bay { int t; int l; }ma[100005],ta[100005]; bool cmp(bay a,bay b) { if(a.t==b.t) return a.l>b.l; else return a.t>b.t; } int main() { int n,m,i,cnt[105],j; while(scanf("%d %d",&n,&m)!=EOF) { for(i=0;i<n;i++) { scanf("%d %d",&ma[i].t,&ma[i].l); } for(i=0;i<m;i++) { scanf("%d %d",&ta[i].t,&ta[i].l); } sort(ma,ma+n,cmp); sort(ta,ta+m,cmp); fill(cnt,cnt+105,0); __int64 sum=0; int j=0,cnt1=0; for(i=0;i<m;i++) { while(ma[j].t>=ta[i].t && j<n) { cnt[ma[j].l]++; j++; } for(int k=ta[i].l;k<101;k++) { if(cnt[k]) { cnt[k]--; sum+=500*ta[i].t+2*ta[i].l; cnt1++; break; } } } printf("%d %I64d\n",cnt1,sum); } return 0; }