贪心:首先把罚分降序排序,然后一个一个安排到deadline,如果那天已经被占,就安排到deadline前一天,如果前面都有安排了就直接扣分(参考了别人的博客)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int mark[1005]; 5 struct course 6 { 7 int p; 8 int d; 9 }c[1005]; 10 int cmp(const void *a,const void *b) 11 { 12 course x=*(course *)a; 13 course y=*(course *)b; 14 return y.p-x.p; 15 } 16 int main() 17 { 18 int t; 19 scanf("%d",&t); 20 while(t--) 21 { 22 int n; 23 scanf("%d",&n); 24 for(int i=0;i<n;i++) 25 scanf("%d",&c[i].d); 26 for(int i=0;i<n;i++) 27 scanf("%d",&c[i].p); 28 qsort(c,n,sizeof(course),cmp); 29 memset(mark,0,sizeof(mark)); 30 int sum=0; 31 for(int i=0;i<n;i++) 32 { 33 int flag=1; 34 for(int j=c[i].d;j>0;j--) 35 { 36 if(mark[j]==0) 37 { 38 mark[j]=1; 39 flag=0; 40 break; 41 } 42 } 43 if(flag) 44 sum+=c[i].p; 45 } 46 printf("%d\n",sum); 47 48 } 49 return 0; 50 }