#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct time
{
int deadline;
int score;
}data[10005];
bool cmp(time a,time b)
{
if(a.score!=b.score)//按扣分高低排序,高的在前面
return a.score>b.score;
return a.deadline<b.deadline;//如果成绩相同,时间紧的,就是截止日期短的在前面
}
int z[1005];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m,i,s=0;
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&data[i].deadline);
for(i=0;i<m;i++)
scanf("%d",&data[i].score);
sort(data,data+m,cmp);//结构体排序是牵一发而动全身
memset(z,0,sizeof(z));//z数组是用来标记的,全部清0
for(i=0;i<m;i++)
{
int j=data[i].deadline;//如果这一天没用被占用,就标记下来;
while(j)
{
if(!z[j])
{
z[j]=1;
break;
}
j--;//如果这一天被占用,从截止日期往前推,直到找到一天位置,标记,
}
if(j==0)//如果前面全部被占满,只能扣分
s+=data[i].score;
}
printf("%d\n",s);
}
return 0;
}
主要靠自己的理解,想了整整一下午!!!只能说贪心博大精深!!!