想了好久
先按照减的分数高低排序 相同分数按照时间从小到大排序
之后从后遍历 能填的填上 不能填的加sum上
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
using namespace std;
struct day
{
int a,b;
}z[1020];
int cmp(const day &x,const day &y)
{
if(x.b!=y.b)
return x.b>y.b;
return x.a<y.a;
}
int vis[1020];
int hash[10020];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
int big=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%d",&z[i].a);
for(int i=1;i<=n;i++)
scanf("%d",&z[i].b);
sort(z+1,z+n+1,cmp);
memset(hash,0,sizeof(hash));
int i,j;
int sum=0;
for(i=1;i<=n;i++)///
{
for(j=z[i].a;j>=1;j--)
{
if(!hash[j])
{hash[j]=1;break;}
}
if(j==0)//如果插不上则减分
sum+=z[i].b;
}
cout<<sum<<endl;
}
}