贪心啊,现在彻底凌乱了,看的一本算法设计的书上有讲解了个区间最小延迟问题,和1074彻底混一起了,郁闷啊!这一题就是按减分从高到低排序,完了建一个mark数组记录那一天被分配,尽量靠近截止日期,若没有时间则算为延迟,扣分。代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
struct homework{
int d,r;
}h[1010];
bool cmp(struct homework a,struct homework b)
{
if(a.r==b.r) return a.d<b.d;
return a.r>b.r;
}
int main()
{
int t;
cin>>t;
while(t--){
int n,mark[1010]={0};
cin>>n;
for(int i=1;i<=n;i++) cin>>h[i].d;
for(int i=1;i<=n;i++) cin>>h[i].r;
sort(h+1,h+n+1,cmp);
int r=0;
for(int i=1;i<=n;i++){
int j=h[i].d;
while(j>=1&&mark[j]) j--;
if(j==0) r+=h[i].r;
else mark[j]=1;
}
cout<<r<<endl;
}
return 0;
}