Ignatius刚刚从第30届ACM / ICPC回到学校。现在他有很多作业要做。每个老师给他一个截止作业的截止日期。如果Ignatius在截止日期之后进行了家庭作业,老师将减少他的最终考试成绩。现在我们假设做每个老师的作业总是需要一天的时间。以Ignatius希望你帮他安排做作业的顺序来减少分数的减少。
输入
每个测试用例从正整数N(1 <= N <= 1000)开始,表示作业数。然后两行。 第一行包含N个整数,表示作业的期限,下一行包含N个整数,表示减少的分数。
输出
对于每个测试用例,应该输出减少的最小总分数,每个测试用例一行。
Sample Input
3 3 3 3 3 10 5 1 3 1 3 1 6 2 3 7 1 4 6 4 2 4 3 3 2 1 7 6 5 4
Sample Output
0 3 5
Ignatius比赛回来之后,每位老师给Ignatius一个交作业的最后期限,如果交不上去就扣分。每门作业都要一天时间完成,求最少扣多少分。先输入一个T表示有T组测试数据,接下来每组数据先输入一个N,代表有N个作业,然后输入两行,第一行表示每门作业要交的日期,第二行表示对应的如果不交这门作业要扣的分数。输出要扣的最少分数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node{ 4 int dayline; 5 int descore; 6 bool flag; 7 }homework[1005]; 8 bool cmp(node a,node b) 9 { 10 if(a.dayline!=b.dayline) 11 return a.dayline < b.dayline; /*按期限从短到长排序*/ 12 else 13 return a.descore>b.descore; /*如果期限相同,按被扣分数从高到低来排序*/ 14 } 15 16 int main() 17 { 18 int t,n,temp; 19 while(cin>>t) 20 { 21 while(t--) 22 { 23 scanf("%d",&n); /*作业的数量*/ 24 for(int i = 0; i < n; i++) /*读取作业的期限*/ 25 scanf("%d",&homework[i].dayline); 26 for(int i = 0; i < n; i++) /*读取未完成作业被扣除的分数*/ 27 { 28 scanf("%d",&homework[i].descore); 29 homework[i].flag = true; /*标记可完成*/ 30 } 31 32 sort(homework,homework+n,cmp); 33 int ans = 0; /*统计被扣除的分数*/ 34 int day = 1; /*截止日期*/ 35 for(int i = 0; i < n; i++) 36 { 37 if(homework[i].dayline >= day) 38 day++; 39 else{ 40 int p = homework[i].descore; 41 int temp = i; 42 for(int j =0; j < i; j++) /*往前面搜索,查找是否有被扣分数较小的*/ 43 if(homework[j].descore < p && homework[j].flag) /*被扣分数较少 并且是可完成的(用来完成被扣分较大的作业)*/ 44 { 45 p = homework[j].descore; 46 temp = j; 47 } 48 49 ans += p; 50 homework[temp].flag = false; /*标记不可完成*/ 51 } 52 53 54 } 55 cout<<ans<<endl; 56 } 57 } 58 return 0; 59 }