HDU1789
//贪心,对时间按升序排序,如果时间相同则对分数按降序排序
//按时间顺序来对任务进行标记 能在今天完成则标记1,如果完成不了 则往前面找分数最小
//的进行交换,小的分数加入无法完成的分数.
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct homework
{
int data;
int score;
};
bool cmp(homework a,homework b)
{
if(a.data==b.data)
return a.score>b.score;//假如天数一样,就比较分数大小,大的放前面
else
return a.data<b.data;
}
int main()
{
int t,i,j,min;
int flag[1001];
homework a[1001];
int n,sum,temp,d;
while(cin>>t){
while(t--)
{
cin>>n;
for(i=0;i<n;i++)
cin>>a[i].data;
for(i=0;i<n;i++)
cin>>a[i].score;
sum=0;
sort(a,a+n,cmp);//排序
memset(flag,0,sizeof(flag));
d=1,temp=0;
for(i=0;i<n;i++)
{
if(a[i].data>=d)//假如该天没作业,把a[i]定在该天完成
{
flag[i]=1;
d++;
}
else //假如有已经有作业了,则找出分数最小的与之交换
{
min=a[i].score;
temp=i;//temp为最小的分数的位置
for(j=i-1;j>=0;j--)
if(flag[j]==1&&a[j].score<min)
{
min=a[j].score;
temp=j;
}
sum+=a[temp].score;//sum相加
a[temp].score=a[i].score;//交换
}
}
cout<<sum<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号