小记:这题想好了 很简单


思路:因为求的是最少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;
}