一本通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!