HDU 4442 Physical Examination【2012金華A題,貪心】
阿新 • • 發佈:2019-02-04
這題真不應該花了那麼多時間。當時有了一個想法,但是我沒有順著這個想法做下去。後來還是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; }