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

解题报告:

题目大意:一个人在医院体检,体检有很多项目,也有很多人在等待,现在已知若现在参加第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.

 1 #include<cstdio>
 2 #include<algorithm>
 3 const __int64 mod=365*24*60*60;
 4 struct node {
 5     __int64 a,b;
 6 }list[100005];
 7 bool cmp(node x,node y) {
 8     return (x.a*y.b<y.a*x.b);
 9 }
10 int main() {
11     __int64 N;
12     while(scanf("%I64d",&N)&&N!=0) {
13         for(int i=1;i<=N;++i)
14         scanf("%I64d%I64d",&list[i].a,&list[i].b);
15         std::sort(list+1,list+N+1,cmp);
16         __int64 sum=0;
17         for(int i=1;i<=N;++i) {
18             sum=sum+sum*list[i].b+list[i].a;
19             sum%=mod;
20         }
21         printf("%I64d\n",sum);
22     }
23     return 0;
24 }
25         
View Code

      

原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3097475.html