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