http://acm.hdu.edu.cn/showproblem.php?pid=1789
cmp函数:
先按扣分由多到少进行排序,然后如果遇到扣分一样的,则先做时间少的。
vis数组:
最要的事,放在它的截至日期那一天去做,然后,之后如果有相同的天数,则往前找是否有空余的天数,没有的话就把扣的分值加入sum
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int vis[maxn];
typedef struct
{
int day;
int score;
}S;
S s[maxn];
bool cmp(S a,S b)
{
if(a.score>b.score)
return 1;
else if(a.score==b.score)
{
if(a.day<b.day)
return 1;
else
return 0;
}
else
return 0;
}
int main ()
{
int T,n,i,t,sum;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&s[i].day);
for(i=0;i<n;i++)
scanf("%d",&s[i].score);
sort(s,s+n,cmp);
sum=0;
for(i=0;i<n;i++)
{
t=s[i].day;
while(t)
{
if(!vis[t])
{
vis[t]=1;
break;
}
else
t--;
if(t==0)
sum+=s[i].score;
}
}
printf("%d\n",sum);
}
return 0;
}