和上周杭电新生赛类似的题,想想上次WA九发都没对,真是欲哭无泪。
Description
伊格内修斯刚刚参加完ACM/ ICPC比赛回来。现在,他有很多功课要做。每一位老师给他规定了功课提交的最后期限。
如果伊格内修斯的在截止日期后的递交作业,老师会减少他的最终测试得分。现在我们假设他每天都在做功课。每门功课总是需要一天时间。现在,伊格请你帮他安排做功课,尽量减少降低分数的顺序。
Input
输入包含多个测试用例。输入的第一行是一个单一的整数t即测试用例的数目。
每个测试用例开始一个正整数N(1<= N <= 1000),其表示一共有多少门作业作业。接着两行数据。
第一行包含N个整数,表明该科目的最后期限,而下一行包含N个整数,表明了降低分数。
Output
对于每一个例子,你需要输出最少的可能降低的分数,每个测试占一行
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
#include <bits/stdc++.h>
using namespace std;
struct stu{
int deadline;
int score;
}s[1010];
bool cmp(stu x, stu y)
{
if(x.score==y.score) return x.deadline > y.deadline;
return x.score > y.score;
}
int main()
{
int t;
scanf("%d", &t);
while(t--){
int n;
scanf("%d", &n);
int maxday = 0;
for(int i = 0; i < n; i++){
scanf("%d", &s[i].deadline);
maxday = max(s[i].deadline,maxday);
}
//cout << maxday << endl;
for(int i = 0; i < n; i++) scanf("%d", &s[i].score);
sort(s,s+n,cmp);
int decline = 0;
for(int i = maxday; i > 0; i--){
for(int j = 0; j < n; j++){
if(s[j].deadline>=i&&s[j].score!=0){
s[j].score = 0;
break;
}
}
}
for(int i = 0; i < n; i++){
decline += s[i].score;
}
printf("%d\n", decline);
}
return 0;
}