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