题目:http://noi.openjudge.cn/ch0406/2469/
分析:对于每一组数据只要判断最大的那个数是不是比其余的数的和都要大,如果成立的话那当然就是剩下的所有电池与最大的电池车轮战,最大为n-1个数的和,如果不成立的话那么最大就是n个数的和的一半,也就是说电池是一定可以全部用完的。讲一下简单的证明过程,每次先对N个数进行排序,然后最大电池每次与其余电池(从高到低)PK一小时,如此进行下去最后必然是三种情况中的一种即(2 1 1)(1 1)(1 1 1),这三种情况都是可以用完的,所以电池必定会全部用完。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,sum,top;
int main()
{
int i,a;
while(scanf("%d",&n)==1)
{
sum=0;
top=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
sum+=a;
top=max(top,a);
}
if(top>=sum-top) printf("%.1f\n",1.0*sum-1.0*top);
else printf("%.1f\n",1.0*sum/2.0);
}
return 0;
}