• 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;
    }
    


  • 相关阅读:
    Win10使用VMware虚拟机安装ubuntu
    算法资源清单
    JAVA Synchronized (三) volatile 与 synchronized 的比较
    JAVA Synchronized (二)
    Java多线程:线程状态以及wait(), notify(), notifyAll()
    Java中断机制
    Java throw与throws
    Java(Android)线程池
    JAVA interrupte中断线程的真正用途
    Java 守护线程
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7283640.html
Copyright © 2020-2023  润新知