您的位置:首页 > 其它

hdu 4442 Physical Examination

2015-11-12 15:50 239 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4442

题意:去体检,求做完所有检查所花费的最小时间模上一个数

花费的时间规则如下

有n项活动,每项活动有两个数字 a b

a代表现在去排队所花费的时间 b代表每一秒该活动需要等待的时间是多b秒

举个简单的例子

2

1 3 第一项活动1秒,执行完第一项活动之后执行第二项

1 9 由于先执行的第一项活动,执行第二项活动时所需的时间就变成了10秒

[b]题目分类:贪心[/b]

题目分析:因为当执行当前任务时,b是乘以现在所需要的时间,a是直接相加的,刚开始时想的是b的权重比较大,所以,按照b从大到小的排序,a不用管,后来细细想想,其实是有漏洞的,如果b比较小,而a特别大的时候,顺序就是不对的。

代码:

#include<bits/stdc++.h>

using namespace std;

#define LL __int64
#define MOD 31536000

struct P
{
LL a,b;

}num[100009];

//bj*ai<=aj*bi

LL cmp(P X,P Y)
{
return X.a*Y.b<Y.a*X.b;
}

int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
{
cin>>num[i].a>>num[i].b;
}
sort(num+1,num+n+1,cmp);
/*for(int i=1;i<=n;i++)
{
cout<<num[i].a<<"  "<<num[i].b<<endl;
}*/
int ans=0;
for(int i=1;i<=n;i++)
{
ans=(ans+ans*num[i].b+num[i].a)%MOD;
}

cout<<ans<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: