hdu 1789 Doing Homework again (贪心)

思路:把所有的的作业按分值从大到小排序,之后去从最大的那头开始取,在保证完成的情况下尽量靠后安排,如果它截止日期前的每一天都有任务了的话就把这一科的分数加到最后要扣的分中(比如:样例二中排序后应该是6,3,2对应的截止日期分别是1,1,3,所以第1天的时候完成6分的,当到3分的时候因为截至日期是1而且第1天也已经有任务了所以这一科他就无法完成)

很久以前做的一个题了!!

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 1010
 4 int flag[1010];
 5 int main()
 6 {
 7     int t,n,day[N],num[N],sum,i,j,t1,t2/*,maxday*/;
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         //maxday=0;
12         sum=0;
13         scanf("%d",&n);
14         for(i=0;i<n;i++)
15         {
16             scanf("%d",&day[i]);
17            // if(day[i]>maxday)
18             //maxday=day[i];
19         }
20         for(i=0;i<n;i++)
21         {
22             scanf("%d",&num[i]);
23         }
24         for(i=0;i<n-1;i++)
25         {
26             for(j=i+1;j<n;j++)
27             {
28             if(num[i]<num[j])
29             {
30                 t1=num[i];
31                 num[i]=num[j];
32                 num[j]=t1;
33                 t2=day[i];
34                 day[i]=day[j];
35                 day[j]=t2;
36             }
37             }
38         }
39         memset(flag,0,sizeof(flag));
40         for(i=0;i<n;i++)
41         {
42             for(j=day[i];j>0;j--)
43             {
44                 if(flag[j]==0)
45                 {
46                     flag[j]=1;
47                     break;
48                 }
49             }
50             if(j==0)
51             sum+=num[i];
52         }
53             printf("%d\n",sum);
54     }
55     return 0;
56 }

作者: 点A点C

出处: http://www.cnblogs.com/ACshasow/>

关于作者:游戏开发、算法研究,请多多赐教!

本文版权归作者(点A点C)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(572779130@qq.com)咨询.

原文地址:https://www.cnblogs.com/ACshasow/p/2764126.html