http://icpc.upc.edu.cn/problem.php?cid=1424&pid=9
认真思考后,正确的贪心策略应该是先考虑扣分最多的作业,从截止的那天开始安排,若已安排其他的作业则继续向前安排,成功AC。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct str
{
int x,y;
bool operator<(const str &str1)const
{
return y>str1.y;
}
} a[1000000];
int v[100005],t,n,ans,i,k;
int main()
{
while(~scanf("%d",&t))
while(t--)
{
memset(v,0,sizeof(v));
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&a[i].x);
for(i=1; i<=n; i++)
scanf("%d",&a[i].y);
sort(a+1,a+n+1);
ans=0;
for(i=1; i<=n; i++)
{
k=a[i].x;
while(k)
if(v[k]==0)
{
v[k]=1;
break;
}
else if(k==1){
ans+=a[i].y;
k--;
}
else
k--;
}
printf("%d\n",ans);
}
}