贪心题。 因为一门作业完成时间都是一天。 所以扣分多的自然要先完成。
先按照分值 从大到小排序,再按照 时间从大到小排序。 也就是 分值越高 越晚的先做。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 1000+10
#define INF (1<<30)
#define mod 123456789
struct Homework{
int time;
int score;
friend bool operator < (Homework a, Homework b){
if(a.score != b.score)
return a.score < b.score;
else
return a.time > b.time;
}
};
int main (){
int t;
scanf("%d",&t);
while(t--){
int n;
Homework s[MAXN];
scanf("%d",&n);
int sum = 0;
int vis[MAXN] = {0};
for(int i = 1; i <= n; i++)
scanf("%d",&s[i].time);
for(int i = 1; i <= n; i++){
scanf("%d",&s[i].score);
sum += s[i].score;
}
sort(s+1,s+1+n);
for(int i = n; i >= 1; i--){
for(int j = s[i].time; j >= 1; j--){
if(!vis[j]){
vis[j] = 1;
sum -= s[i].score;
break;
}
}
}
printf("%d\n",sum);
}
return 0;
}