一道入门级别的贪心,对于每种作业,最理想的情况是刚好在截止日期完成,然后之前的日子就可以给别的作业。然后尽可能先写分数高的,再写分数低的。我们首先把作业按照分数从高到低排序,如果分数相同,那么截止日期靠前的排在前边。然后从前向后遍历,如果某个作业在截止日期当天没有其他作业安排,那么就在这天完成,否则就要向前寻找空闲的天,如果都找不到,那这么作业就无法完成了,只能扣分,可以用一个一维数组标记某天有没有作业安排。

#include<bits/stdc++.h>
using namespace std;
struct Node{
    int e,s;
}node[1005];
int book[1005];
bool cmp(Node a,Node b){
    if(a.s!=b.s) 
        return a.s>b.s;
    return a.e<b.e;
}
int main(){
    int t,n,m,sum,now;
    cin>>t;
    while(t--){
        memset(book,0,sizeof(book));
        now=1;
        sum=0;
        cin>>n;
        for(int q=0;q<n;q++) { cin>>node[q].e; }
        for(int q=0;q<n;q++) { cin>>node[q].s; }
        sort(node,node+n,cmp);
        for(int q=0;q<n;q++){
            m=node[q].e;
            while(m){
                if(!book[m]) { book[m]=1; break; }
                else m--;
                if(m==0) { sum+=node[q].s; }
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}