一本通1229 电池的寿命

传送门

这个题开始没明白,后来看了一会,题干懂了,然后没思路,没治,看了眼题解,分析了一下。

先上代码,跟着代码分析

#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
#define INF 0x7f7f7f
using namespace std;
int n;
ll sum,da;
ll a[1010];
int main(){
    ios::sync_with_stdio(0);
    while(cin >> n){
        da = -INF,sum = 0;
        for( int i = 1;i <= n;i++ ){
            cin >> a[i];
            da = max( da,a[i] );
            sum += a[i];
        }
        if( da >= sum-da ) //
       printf( "%.1lf\n",(sum-da)*1.0 ); else //
       printf( "%.1lf\n",(sum*1.0)/2 ); } return 0; }

分析一下,很明显,da就是整个数组里的最大值,sum是整个数组的和;

这样for就分析完了,来看判断。

:说明剩下所有的电池加起来也就能耗过这个最大的电池,直接看剩下所有电池能撑多久

:说明剩下所有的电池能耗过这个大电池,那就掰开分半小时,总能做到无浪费

如:

若原序列为:7 4 2 6
我们可以将所有的以半小时为单位计算,即新数列为:
        14 8 4 12
然后就掰:ans += 14 = 7 + 7
    当前序列:1 4 5
然后就显然了,ans += 5 = 1 + 4
ans = 19,输出除以2,得8.5
sum = 7 + 4 + 2 + 6 = 19

再来一个例子,原序列为:4 9 5 11 3
新序列为:8 18 10 22 6
开始掰:ans += 22 = 10 + 12
    当前序列:8 18-12 10-10 6 ---> 8 6 6
再掰:ans += 8 = 4 + 4
    当前序列:6-4 6-4  ---> 2 2
显然了:ans += 2
所以ans = 32,输出除以2,得16
sum = 4 + 9 + 5 + 11 + 3 = 32
嘿嘿 :-)

over!

 

posted @ 2021-08-29 10:57  little_sheep_xiaoen  阅读(767)  评论(0编辑  收藏  举报