电池的寿命
思路:
首先,我们观察发现:由于每枚电池的使用时间不同,而我们又要减少浪费才能使所有电池加起来用得最久,不难发现:当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;
}