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;
}
本文介绍了一道HDU ACM竞赛题目(编号1789)的解题思路,通过自定义比较函数cmp对任务按扣分从多到少排序,相同扣分则按时间排序。使用vis数组记录每天的任务状态,优先安排截止日期当天的任务,若该天已满则向前寻找可用日期,最终计算无法安排任务的总扣分。
304

被折叠的 条评论
为什么被折叠?



