思路:
首先,我們觀察發現:由于每枚電池的使用時間不同,而我們又要減少浪費才能使所有電池加起來用得最久,不難發現:當n=2時,輸出較小值。
第一步:將電池分為兩組,使兩組電池的總使用時長的差值盡可能小。
第二步:如果總時長更長的分組中有多于1個電池,那么取出這一組中的一些電池運行游戲機,消耗其中一些電池的電量,使得兩組電池的使用時長相等。
代碼解釋
- 輸入處理:借助
while (scanf("%d", &n) != EOF)
持續讀取每組數據的電池數量n
。 - 電池數據讀取:用數組
a
來存儲每個電池的使用時長,同時在讀取時計算總時長sum
,并找出使用時長最長的電池maxn
。 - 判斷最長使用時間:
- 如果除最長電池外其他電池總時長小于最長電池時長,那么最長使用時間就是其他電池的總時長。
- 如果除最長電池外其他電池總時長大于等于最長電池時長,那么最長使用時間為所有電池總時長的一半。
- 輸出結果:以保留一位小數的格式輸出結果。
其實對于每一組數據只要判斷最大的那個數是不是比其余的數的和都要大,如果成立的話那當然就是剩下的所有電池與最大的電池車輪戰,最大為n-1個數的和,如果不成立的話那么最大就是n個數的和的一半,也就是說電池是一定可以全部用完的。
代碼:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int main(){int n;while(scanf("%d",&n)!=EOF) {int maxn=-1,sum=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i]; if(maxn<a[i]) maxn=a[i]; }if((sum-maxn)<maxn){printf("%.1f\n",(sum-maxn)*1.0);}else{printf("%.1f\n",(sum-maxn-maxn)*1.0/2+maxn);}}return 0;
}