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 }
View Code

 

posted @ 2016-07-12 17:40  遗风忘语  阅读(268)  评论(0编辑  收藏  举报