1229:电池的寿命

1229:电池的寿命

【题目描述】
小S新买了一个掌上游戏机,这个游戏机由两节5号电池供电。为了保证能够长时间玩游戏,他买了很多5号电池,这些电池的生产商不同,质量也有差异,因而使用寿命也有所不同,有的能使用5个小时,有的可能就只能使用3个小时。显然如果他只有两个电池一个能用5小时一个能用3小时,那么他只能玩3个小时的游戏,有一个电池剩下的电量无法使用,但是如果他有更多的电池,就可以更加充分地利用它们,比如他有三个电池分别能用3、3、5小时,他可以先使用两节能用3个小时的电池,使用半个小时后再把其中一个换成能使用5个小时的电池,两个半小时后再把剩下的一节电池换成刚才换下的电池(那个电池还能用2.5个小时),这样总共就可以使用5.5个小时,没有一点浪费。
现在已知电池的数量和电池能够使用的时间,请你找一种方案使得使用时间尽可能的长。

【输入】
输入包含多组数据。每组数据包括两行,第一行是一个整数N(2≤N≤1000),表示电池的数目,接下来一行是N个正整数表示电池能使用的时间。

【输出】
对每组数据输出一行,表示电池能使用的时间,保留到小数点后1位。

【输入样例】
2
3 5
3
3 3 5

【输出样例】
3.0
5.5

思路:首先,我们有一节3小时和5小时的电池,这样一定会只能用3小时;但我们有两节3小时和一节5小时的电池,就可以先用半小时的三小时电池,再换上五小时电池,就可以用5.5小时了。
我们观察发现:由于每枚电池的使用时间不同,而我们又要减少浪费才能使所有电池加起来用得最久,不难发现:如果我们把使用时间最长的电池比喻成第一战队,其他电池比喻成第二战队,使用时间就是战斗力(比喻还比较形象吧!),然后,两个战队开战,如果第二战队耗尽全力,而第一战队还没有挂掉,那么说明总用时为第二战队的所有能量,拿回本题说就是不是使用时间最长的电池的其他所有电池的使用时间的和,第二种情况就是,第一战队耗尽全力,而第二战队还没挂,那么,第二战队由于是多节电池,所以剩下的也不能闲着,就爆发内战,也就是说让剩下的电池自相残杀,每两节电池相互残杀半小时,这样总会怼完(我不知道怎么形容了 ^^),至于为什么是怼半小时而不是一小时,这里就卖个关子,请读者自己思考 _,可能这样说,代码都已经显而易见的。还是上代码吧!!!

最后要注意是输出一位小数(最好用double)。

#include
using namespace std;
int a[1005];
int main()
{
    int n;
    while(cin>>n){
        int max=-1,sum=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum=sum+a[i];
            if(max<a[i]){
				max=a[i];
        	}
        }	
        if((sum-max)<max){
            printf("%.1f\n",(sum-max)*1.0); 
        }
        else{
            printf("%.1f\n",(sum-max-max)*1.0/2+max);
        }
    }
    return 0;
} 

你可能感兴趣的:(1229:电池的寿命)