http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2177
题目描述
大家都知道,新生入学的前几周要体检,体检的那一天 HH 早起(九点半)来到了校医院,但是到了之后她发现排队等候体检的人太多了,而且人数在不断的增加。体检需要检查许多个项目,每个项目都需要排队,而且随着时间的推移,每个队列的人数都在慢慢增加。
已知每个体检项目的队列都有两个属性(ai, bi):
1、如果 HH 在 0 时刻站在了这个队列后,那么她需要 ai 秒就可以完成这个项目的体检;
2、如果 HH 没在这个队列中,那么 HH 完成这个项目的时间每秒会在 ai 的基础上增加 bi 秒。
作为一个测肺活量的时候怒吹了 1000+ 的大神,她希望能尽快体检完毕去吃饭,所以选择正确的体检顺序是非常非常重要的。
输入
输入包含多组测试数据,对于每组测试数据:
输入的第一行为一个正整数 n(1 ≤ n ≤ 10
5
),代表需要体检的项目数;
接下来 n 行每行为两个正整数 a,b(0 ≤ a, b < 1000), 依次代表第1-n个队列的两个属性。
注意:64-bit 整型请使用 long long 来定义,并且使用 %lld 或 cin、cout 来输入输出,请不要使用 __int64 和 %I64d。
输出
输出完成体检的最短时间,由于最后结果可能会很大,所以你只要输出结果对365×24×60×60取余后的结果即可。
示例输入
2 3 1 2 3 5 1 2 2 3 3 4 4 5 5 6
示例输出
7 1419
提示
样例解释:
第一组样例,最短时间:HH 先排在第二个队伍,用时 2 秒体检完成第二个项目,然后排在第一个队伍,用时 5 秒完成第一个项目,总用时 7 秒。
第二组样例,最短时间:HH 按照给定的顺序, 用时 1 秒体检完成第一个项目,用时 5 秒完成第二个项目,用时 27 秒完成第三个项目,用时 169 秒完成第四个项目,用时 1217 秒完成第五个项目,总用时 1+5+27+169+1217=1419 秒。
1 #include<stdio.h> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std ; 6 const int maxn = 100010 ; 7 struct node 8 { 9 int a,b ; 10 double c ; 11 bool friend operator < (node x,node y) 12 { 13 return x.c < y.c; 14 } 15 }ss[maxn]; 16 int main() 17 { 18 int n ; 19 while (cin>> n) 20 { 21 for ( int i = 0 ; i <= n- 1 ; i ++ ) 22 { 23 scanf( " %d %d " ,&ss[i].a,& ss[i].b); 24 ss[i].c = ss[i].a* 1.0 / ss[i].b; 25 } 26 sort(ss,ss+ n); 27 long long sum = ss[ 0 ].a; 28 for ( int i = 1 ; i <= n- 1 ; i ++ ) 29 { 30 sum = (sum+sum*ss[i].b+ss[i].a)%( 365 * 24 * 60 * 60 ); 31 } // 取余这个地方一定不能在输出那儿取余,因为longlong存不了那么大的........... 32 printf( " %lld\n " ,sum); 33 } 34 return 0 ; 35 }
这个题不是特别难,但是要注意,longlong是存不了太大的数据的