/*
分析:
简单贪心,一开始没想到思路。
很直观的,第一步按照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;
}