原文出处:http://dan910808.blog.163.com/blog/static/193943203201272091648160/
思路:
按代价大小从高到低排序,代价一样则最后期限早的在前,
按排序顺序遍历,事件安排进终止日期那一天,如果该日期已被那排,就在往前推,
如果最后安排不下,就扣分。
#include<iostream>
#include<algorithm>
using namespace std;
struct data
{
int d,s;
}num[1005];
bool cmp(const data &a,const data &b)
{
if(a.s!=b.s)
return a.s>b.s;
else
return a.d<b.d;
}
int main()
{
int t,n,sum,i,j;
int tag[1005];//这天是否已被安排
cin>>t;
while(t--)
{
sum=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>num[i].d;
}
for(i=0;i<n;i++)
cin>>num[i].s;
sort(num,num+n,cmp);
memset(tag,0,sizeof(tag));
for(i=0;i<n;i++)
{
for(j=num[i].d;j>0;j--)
{
if(!tag[j])
{
tag[j]=1;
break;
}
}
if(!j)
sum+=num[i].s;
}
cout<<sum<<endl;
}
return 0;
}