/*
分析:
简单贪心,一开始没想到思路。
很直观的,第一步按照score从大到小排序,如果score
相等,则按照deadline从小到大排。
然后开始选择,让当前的课排在其deadline上面,如果
这一天已经被占用了,那么就往前循环,有位置了就安排,
没了就ans+=score。
2012-11-21
*/
分析:
简单贪心,一开始没想到思路。
很直观的,第一步按照score从大到小排序,如果score
相等,则按照deadline从小到大排。
然后开始选择,让当前的课排在其deadline上面,如果
这一天已经被占用了,那么就往前循环,有位置了就安排,
没了就ans+=score。
2012-11-21
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct A
{
int dead,score;
}E[1011];
int hash[1011];
int cmp(const void *a,const void *b)
{
A *c,*d;
c=(A *)a;
d=(A *)b;
if(c->score!=d->score) return d->score-c->score;
else return c->dead-d->dead;
}
int main()
{
int T;
int n;
int i,l;
int ans;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
E[0].dead=-1;
E[0].score=11111111;
for(i=1;i<=n;i++) scanf("%d",&E[i].dead);
for(i=1;i<=n;i++) scanf("%d",&E[i].score);
qsort(E,n+1,sizeof(E[0]),cmp);
ans=0;
memset(hash,0,sizeof(hash));
for(i=1;i<=n;i++)
{
for(l=E[i].dead;l>0;l--) if(hash[l]==0) {hash[l]=1;break;}
if(l<=0) ans+=E[i].score;
}
printf("%d\n",ans);
}
return 0;
}