贪心策略:
情况一:
如果最大的电池寿命大于其他所有的电池寿命之和,ans为其他所有的之和
情况二:
如果最大的电池寿命小于其他所有电池寿命之和 ,ans为所有电池寿命的一半
情况一很容易证明,比如电池寿命分别为:(a_1, a_2, a_3, ... , a_n), 如果(a_n > sum_{k=1}^{n-1} a_k) 那么就用每一个(a_k (kin[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
",ans);
}
return 0;
}