题目的意思是要使Ignatius尽可能少扣分,所以我们要尽量挑分高的优先完成,每个作业都有对应的截至日期和分数。所以最优策略就是优先找分高的,最好在截止日期当天完成(不影响别的作业),如果当天已经有作业占用了,就往前推,如果前面的日期都被别的作业占用了就意味着这个作业不能完成了,就累加到自己定义的失分变量中。
#include <iostream>
using namespace std;
typedef struct date
{
int deadline;
int score;
}date;//结构体数据类型
date ss[1000];
int flag[1001];//表示日期是否被占用
void quicksort(date ss[],int l,int r)//快排
{
if(l>=r)
return;
int i=l;
int j=r;
int key=ss[l].score;
int dead=ss[l].deadline;
while(i<j)
{
while(i<j&&ss[j].score>=key)
j--;
if(i<j)
{
ss[i].score=ss[j].score;
ss[i].deadline=ss[j].deadline;
i++;
}
while(i<j &&ss[i].score<key)
i++;
if(i<j)
{
ss[j].score=ss[i].score;
ss[j].deadline=ss[i].deadline;
j--;
}
}
ss[i].deadline=dead;
ss[i].score=key;
quicksort(ss,l,i-1);
quicksort(ss,i+1,r);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<1000;i++)//初始化标志变量
{
flag[i]=0;
}
for(int i=0;i<n;i++)
{
cin>>ss[i].deadline;
}
for(int i=0;i<n;i++)
{
cin>>ss[i].score;
}
quicksort(ss,0,n-1);//按分数从小到大排
int ans=0;//失分变量
for(int v=n-1;v>=0;v--)//从大分数遍历到小分数
{
if(flag[ss[v].deadline]==0)//日期未占用
{
flag[ss[v].deadline]=1;
}
else
{
int m=ss[v].deadline-1;//往前推日期
while(m)
{
if(flag[m]==0)
{
flag[m]=1;
break;
}
else
{
m--;
}
}
if(m==0)//说明这个作业完不成了
ans+=ss[v].score;
}
}
cout<<ans<<endl;
}
return 0;
}