您的位置:首页 > 其它

HDU 4442 Physical Examination 2012亚洲区域赛金华现场赛A题

2013-05-24 19:07 543 查看
解题报告:

题目大意:一个人在医院体检,体检有很多项目,也有很多人在等待,现在已知若现在参加第i个项目的体检需要ai秒,并且每过1秒钟参加这个项目需要的时间

就增加bi,问这个人最快完成体检需要多久。

这题可以看成是一道DP题,首先需要对所有的项目进行排一个序,表示先后进行哪些项目的体检。排序按照ai*b[i-1]与bi*a[i-1]的大小,这种排序的思想就是

把N个项目的排序先缩小到两个项目的排序,就是确定这两个项目到底哪个先进行,ai*b[i-1]的意思就是当先进行第i项目的体检时完成这两项体检一共需要的时间就

是ai*b[i-1],因为先进行第i项目的体检,所以完成第i项的时间为0,完成第i-1项的时间就是ai*b[i-1]所以总的时间就是ai*b[i-1],下同。需要注意的是这题数据范围比较大,

需要用__int64.

#include<cstdio>
#include<algorithm>
const __int64 mod=365*24*60*60;
struct node {
__int64 a,b;
}list[100005];
bool cmp(node x,node y) {
return (x.a*y.b<y.a*x.b);
}
int main() {
__int64 N;
while(scanf("%I64d",&N)&&N!=0) {
for(int i=1;i<=N;++i)
scanf("%I64d%I64d",&list[i].a,&list[i].b);
std::sort(list+1,list+N+1,cmp);
__int64 sum=0;
for(int i=1;i<=N;++i) {
sum=sum+sum*list[i].b+list[i].a;
sum%=mod;
}
printf("%I64d\n",sum);
}
return 0;
}


View Code

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