1. 程式人生 > >HDU 4442 Physical Examination【2012金華A題,貪心】

HDU 4442 Physical Examination【2012金華A題,貪心】

這題真不應該花了那麼多時間。當時有了一個想法,但是我沒有順著這個想法做下去。後來還是zz_1215那樣做了,果斷AC。他說:“我不知道為什麼這樣,但哥就是AC啦!”

其實是這樣的:

假設已經花了t秒,而現在有兩個專案可選,所需時間分別為a1, b1和a2, b2。

先選專案1再選專案2所需時間為:t1 = a1+b1*t + b2*(a1+b1*t+t)+a2 = a1+a2+(b1+b2)*t+b1*b2*t+a1*b2;

先選專案2再選專案1所需時間為:t2 = a2+b2*t + b1*(a2+b2*t+t)+a1 = a1+a2+(b1+b2)*t+b1*b2*t+a2*b1.

可以發現,兩種選法對結果的影響的差別只與以上兩式的最後一項有關,由此就可以確定排序方法。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

const int maxn = 100010;
const int mod = 365*24*60*60;
int n;
struct Node {
    long long a, b;
}e[maxn];

bool cmp(Node n1, Node n2)
{
    return n1.a * n2.b < n1.b * n2.a;
}

int main()
{
    while (scanf("%d", &n) != EOF) {
        if (n == 0) break;
        for (int i = 0; i < n; ++i) {
            scanf("%lld%lld", &e[i].a, &e[i].b);
        }
        sort(e, e + n, cmp);
        long long ans = 0;
        for (int i = 0; i < n; ++i) {
            ans  += e[i].a + ans * e[i].b;
            ans %= mod;
        }
        printf("%lld\n", ans);
    }
    return 0;
}