SUDT2177体检

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 ≤ 105),代表需要体检的项目数;
接下来 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
",sum);
33     }
34     return 0;
35 }
View Code

这个题不是特别难,但是要注意,longlong是存不了太大的数据的

 
原文地址:https://www.cnblogs.com/luyingfeng/p/3233416.html