思路:从最后一天开始,找出当天能完成的作业里惩罚最大那个,将其完成,然后天数向前推,推到第一天为止。
其实和从第一天开始,每天找出能完成且惩罚最大的这种思路有点像,但是这样的做法造成的浪费太大,比如可能第一天就去把第四天的完成掉,这样第一天就不能做别的。从后往前就是减少了浪费,将浪费压缩到最低。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define MAX 1005 5 6 int main(void) 7 { 8 int t,n; 9 int s[MAX][2]; 10 int sum,box,max,max_loc; 11 12 scanf("%d",&t); 13 while(t --) 14 { 15 sum = box = 0; 16 17 scanf("%d",&n); 18 for(int i = 0;i < n;i ++) 19 scanf("%d",&s[i][0]); //0号单元存天数 20 for(int i = 0;i < n;i ++) 21 { 22 scanf("%d",&s[i][1]); //1号单元存惩罚值 23 sum += s[i][1]; 24 } 25 for(int i = n;i >= 1;i --) 26 { 27 max = -1; 28 for(int j = 0;j < n;j ++) 29 if(s[j][0] >= i && s[j][1] > max) 30 { 31 max = s[j][1]; 32 max_loc = j; 33 } 34 if(max != -1) 35 { 36 box += max; 37 s[max_loc][1] = -1; 38 } 39 } 40 printf("%d ",sum - box); 41 } 42 }