HDU 4442 Physical Examination

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4442

Physical Examination

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6575 Accepted Submission(s): 1897

Problem Description


WANGPENG is a freshman. He is requested to have a physical examination when entering the university.
Now WANGPENG arrives at the hospital. Er….. There are so many students, and the number is increasing!

There are many examination subjects to do, and there is a queue for every subject. The queues are getting longer as time goes by. Choosing the queue to stand is always a problem. Please help WANGPENG to determine an exam sequence, so that he can finish all the physical examination subjects as early as possible.


Input


There are several test cases. Each test case starts with a positive integer n in a line, meaning the number of subjects(queues).
Then n lines follow. The i-th line has a pair of integers (ai, bi) to describe the i-th queue:
1. If WANGPENG follows this queue at time 0, WANGPENG has to wait for ai seconds to finish this subject.
2. As the queue is getting longer, the waiting time will increase bi seconds every second while WANGPENG is not in the queue.
The input ends with n = 0.

For all test cases, 0<n≤100000, 0≤ai,bi<2^31.


Output


For each test case, output one line with an integer: the earliest time (counted by seconds) that WANGPENG can finish all exam subjects. Since WANGPENG is always confused by years, just print the seconds mod 365×24×60×60.


Sample Input


5
1 2
2 3
3 4
4 5
5 6
0

Sample Output


1419


Hint

In the Sample Input, WANGPENG just follow the given order. He spends 1 second in the first queue, 5 seconds in the 2th queue, 27 seconds in the 3th queue,
169 seconds in the 4th queue, and 1217 seconds in the 5th queue. So the total time is 1419s. WANGPENG has computed all possible orders in his
120-core-parallel head, and decided that this is the optimal choice.

Source

2012 Asia JinHua Regional Contest

Recommend

zhuyuanchen520

大意——要进行一次体检,每个科目都有一个队伍,队伍有两个属性,a和b,分别表示一开始排这个队伍需要的时间,与每秒钟这个队伍将要增加的等待时间。设time为不在这个队伍的时间,则完成这个科目所需的时间为a+b*time。问:给定n个队伍以及它们的属性,求解最少完成所有科目的时间, 结果对365*24*60*60取模。

思路——假设两项科目的属性分别为a1和b1,a2和b2,那么完成两项所需时间为a1+b1*time+a2+b2*(a1+b1*time+time)和a2+b2*time+a1+b1*(a2+b2*time+time),假设前者小于等于后者,化简可得a1*b2<=a2*b1,所以对所有数对进行上式排序即可,最后得到的就是最优的顺序。

复杂度分析——时间复杂度:O(n),空间复杂度:O(n)

附上AC代码:


#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
#include <iomanip>
#include <ctime>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned int UI;
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
const double PI = 3.14159265;
const double E = 2.71828182846;
const int MOD = 365*24*60*60;
const int MAX = 100000;
struct node
{
	LL a, b;
} que[MAX];
int n;

bool cmp(node x, node y);

int main()
{
	ios::sync_with_stdio(false);
	while (cin >> n && n != 0)
	{
		for (int i=0; i<n; i++)
			cin >> que[i].a >> que[i].b;
		sort(que, que+n, cmp);
		LL ans = 0;
		for (int i=0; i<n; i++)
		{
			ans += (que[i].a%MOD+(que[i].b%MOD)*(ans%MOD)%MOD)%MOD;
			ans %= MOD;
		}
		cout << ans << endl;
	}
	return 0;
}

bool cmp(node x, node y)
{
	return x.a*y.b <= x.b*y.a;
}


你可能感兴趣的:(HDU,贪心)