思路:把所有的的作业按分值从大到小排序,之后去从最大的那头开始取,在保证完成的情况下尽量靠后安排,如果它截止日期前的每一天都有任务了的话就把这一科的分数加到最后要扣的分中(比如:样例二中排序后应该是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 }