HDU4864:Task(贪心)
题意:
给出n个机器和m个任务,对于一天来说,每个机器有最大工作时间xi,可接受最大等级yi,每个任务有一个工作时间xi,一个等级yi,可获价值为500*xi+2*yi,任务需要在一台机器一天内完成,问我们一天可得到的最大价值。
思路:
由于xi的系数500远大于yi的系数,故只要使xi最大,总价值一定最大。
所以我们从任务开始贪心而不选择从机器开始贪心,将任务和机器以时间从大到小,相同则使等级从大到小进行排序,然后对于每一个任务,记录工作时间大于它的机器,然后从任务的等级开始往上搜,搜到即记录并跳出,最后输出即可。
推荐blog:
http://blog.csdn.net/a601025382s/article/details/38046927
http://www.cnblogs.com/-sunshine/p/3862810.html
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1e5+10; 6 7 int n,m,maxx,sum,coun; 8 struct node 9 { 10 int time,level; 11 bool operator<(const node& p)const 12 { 13 if(time==p.time) return level>p.level; 14 return time>p.time; 15 } 16 }a[maxn],b[maxn]; 17 int c[101]; 18 19 int main() 20 { 21 while(scanf("%d%d",&n,&m)==2) 22 { 23 coun=0; 24 __int64 sum=0; 25 for(int i=1;i<=n;i++) {scanf("%d%d",&a[i].time,&a[i].level);} 26 for(int i=1;i<=m;i++) {scanf("%d%d",&b[i].time,&b[i].level);} 27 sort(a+1,a+n+1);sort(b+1,b+m+1); 28 memset(c,0,sizeof(c)); 29 //for(int i=1;i<=n;i++) printf("%d %d\n",a[i].time,a[i].level); 30 //for(int i=1;i<=m;i++) printf("%d %d\n",b[i].time,b[i].level); 31 for(int i=1,j=1;i<=m;i++) 32 { 33 while(j<=n&&a[j].time>=b[i].time)//统计>=当前任务时间的机器 34 { 35 c[a[j].level]++;//记录机器的等级 36 j++; 37 } 38 for(int k=b[i].level;k<=100;k++)//从当前任务的等级开始 39 { 40 if(c[k])//找到最小的等级 41 { 42 coun++; 43 c[k]--; 44 sum+=500*b[i].time+2*b[i].level; 45 break; 46 } 47 } 48 } 49 printf("%d %I64d\n",coun,sum); 50 } 51 return 0; 52 }
一直地一直地往前走