小记:这题想好了 很简单
思路:因为求的是最少reduce score所以,学分很重要,那么以学分按从大到小进行排序,依次进行处理
贪心的原则是,从它的deadline一直往前看,只要有一天没有使用,那么就使用它。标记即可
当它的deadline之前的日子都不能使用时,那么就只能放弃这个学分了
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define REP(a,b,c) for(int a = b; a < c; ++a)
#define eps 10e-8
const int MAX_ = 1010;
const int N = 100010;
const int INF = 0x7fffffff;
struct node{
int s, e;
}t[MAX_];
bool vis[MAX_];
bool cmp(const node& a, const node& b)
{
if(a.e < b.e)return 0;
else if(a.e == b.e){
if(a.s < b.s)return 0;
else return 1;
}
else return 1;
}
int main()
{
int T;
int n, m;
scanf("%d",&T);
while(T-- && scanf("%d",&n)) {
int ans = 0;
REP(i, 0, n) {
scanf("%d", &t[i].s);
}
REP(i, 0, n) {
scanf("%d", &t[i].e);
ans += t[i].e;
}
sort(t, t+n, cmp);
mst(vis, 0);
REP(i, 0, n){
int tmp = t[i].s;
while(vis[tmp])tmp--;
if(tmp > 0){
vis[tmp] = 1;
ans -= t[i].e;
}
}
printf("%d\n", ans);
}
return 0;
}