贪心——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;
}
 
posted @ 2020-11-21 15:23  VanHope  阅读(290)  评论(0编辑  收藏  举报