1. 程式人生 > 實用技巧 >貪心——poj百鍊3468:電池壽命

貪心——poj百鍊3468:電池壽命

貪心策略:

情況一:

​ 如果最大的電池壽命大於其他所有的電池壽命之和,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;
}