貪心——poj百鍊3468:電池壽命
阿新 • • 發佈:2020-11-21
貪心策略:
情況一:
如果最大的電池壽命大於其他所有的電池壽命之和,ans為其他所有的之和
情況二:
如果最大的電池壽命小於其他所有電池壽命之和 ,ans為所有電池壽命的一半
情況一很容易證明,比如電池壽命分別為:\(a_1, a_2, a_3, ... , a_n\), 如果\(a_n > \sum_{k=1}^{n-1} a_k\) 那麼就用每一個\(a_k (k\in[1, n-1])\) 和\(a_n\) 配對,一直消耗\(a_n\)。這樣就能得到最大的電池壽命:\(\sum_{k=1}^{n-1} a_k\)
重點是如何證明貪心演算法中情況二的正確性:
#include <iostream> #include <cstdlib> #include <algorithm> #include <cstring> using namespace std; const int MAX = 1010; int main() { int N; int a[MAX]; while(cin >> N) { int sum = 0; double ans; memset(a, 0, sizeof(a)); for (int i = 0; i < N; ++i) { cin >> a[i]; sum += a[i]; } sort(a, a+N); sum -= a[N-1]; // 如果最大的電池壽命大於其他所有的電池壽命之和,ans為其他所有的之和 if (sum < a[N-1]) { ans = sum; } // 如果最大的電池壽命小於其他所有電池壽命之和 else { ans = (double) (sum+a[N-1]) / (double)2; } printf("%.1f\n",ans); } return 0; }