注解
1、贪心。贪心策略:先按分数降序,罚分越多的,越应该完成。再按截止日期升序,也就是说罚分相同时,应该先写截止日期早的。
2、排序之后,对排序后的科目,依次填入对应的天数。填入的规则是:先找到当前罚分最多的未完成的作业,然后从他的截止日期那天开始,往前找,哪天还没有安排做作业,就将当前的科目安排到那一天。如果直到第1天,前面的天数都有安排了,那么这个科目就完不成了,也就只能罚分了。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct Work{
int dead;
int score;
};
int compare(Work w1, Work w2){
if(w1.score==w2.score){
return w1.dead<w2.dead;
}
return w1.score>w2.score;
}
int main(){
int T;
cin>>T;
for(int i=0; i<T; i++){
int N;
cin>>N;
Work w[N];
int mmax = -1;
for(int j=0; j<N; j++){
cin>>w[j].dead;
if(w[j].dead>mmax){
mmax = w[j].dead;
}
}
for(int j=0; j<N; j++){
cin>>w[j].score;
}
sort(w, w+N, compare);
int visit[mmax];
memset(visit, 0, sizeof(visit));
int ans = 0;
for(int j=0; j<N; j++){
int pos = w[j].dead-1;
while(pos>=0 && visit[pos]){
pos--;
}
if(pos>=0){
visit[pos] = 1;
}
else{
ans += w[j].score;
}
}
cout<<ans<<endl;
}
return 0;
}