800502电池的寿命 |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述
|
小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 |
其他说明
|
数据范围:输入中已经说明。
|
题解:很奇妙的题。首先,如果最大的那个电池比其他(n-1)个的和还要大,那么最好的方案就是轮流用,答案是那(n-1)个的和。
如果不是,窝萌可以先想一想电池是否会被用完,答案是肯定的。
证明:如果不比其它(n-1)个电池的和要大,那么窝萌这么想:先用那个最大的去削第二大的(动态更新第二大),那么早晚有一天最大的会撑不住(因为它比其他的电池和要小,不能横扫千军嘛),于是它成为了第二大。。。如此往复,那么所有的电池会经历排名逐渐提升再下降的人生,所以窝萌可以说电池的电量是平均的,然后自己再YY一下就知道电池肯定能用完。。。
那就好办了,答案就是总和除以2呗?
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<queue> 6 #include<cstring> 7 #define PAU putchar(' ') 8 #define ENT putchar(' ') 9 using namespace std; 10 const int maxn=1000+10; 11 int n,A[maxn]; 12 inline int read(){ 13 int x=0,sig=1;char ch=getchar(); 14 for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0; 15 for(;isdigit(ch);ch=getchar())x=10*x+ch-'0'; 16 return sig?x:-x; 17 } 18 inline void write(int x){ 19 if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; 20 int len=0,buf[15];while(x)buf[len++]=x%10,x/=10; 21 for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; 22 } 23 void init(){ 24 double ans; 25 while(scanf("%d",&n)==1){ 26 ans=0; 27 for(int i=1;i<=n;i++){ 28 A[i]=read();ans+=A[i]; 29 }sort(A+1,A+n+1); 30 if(A[n]>ans-A[n])ans=ans-A[n]; 31 else ans=ans*0.5; 32 printf("%.1f ",ans); 33 } 34 return; 35 } 36 void work(){ 37 return; 38 } 39 void print(){ 40 return; 41 } 42 int main(){init();work();print();return 0;}