原题: http://acm.hdu.edu.cn/showproblem.php?pid=1789
//题目大意:知道所有作业的截至时间,以及超过截至时间要扣的分数,编写程序写一个解决方案使得扣的分数少
//思路:贪心,按找作业扣的分数由大到小排序,选择离作业截至时期最近的时间做作业。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct H
{
int d;
int k;
}h[1001];
int cmp(H a,H b)
{
if(a.k!=b.k)
{
return a.k>b.k;//a比b扣的分多
}else{
return a.d<b.d;//a比b要急
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int f[1001]={0};
for(int i=0;i<n;i++)
{
scanf("%d",&h[i].d);
}
for(int i=0;i<n;i++)
{
scanf("%d",&h[i].k);
}
sort(h,h+n,cmp);
//每一个作业都要找临近的时间
int ans=0;
for(int i=0;i<n;i++)//遍历每一个作业
{
int t=h[i].d;
while(f[t]==1 && t>=1){
t--;
}
if(t==0)
{
ans=ans+h[i].k;
}else{
f[t]=1;
}
}
printf("%d\n",ans);
}
return 0;
}