题解 CF1557A 【Ezzat and Two Subsequences】
CF1557A Ezzat and Two Subsequences
题目大意:
将序列分成两部分,使平均数之和最大。
solution:
比赛时我是盲猜了一手结论,最大的分一组,其余分一组。感性理解一下就是最大的数尽可能的除以小的数。现在证明一下:
假设 \(a_i\leq a_2 \leq a_3...\leq a_{n-1} \leq a_{n}\) 。用反证法:
假设
化简不等式(我化简了好长时间[流泪])
然后我们设 \(avg_1=\sum ^{n-2} _{i=1} a_i/(n-2)\) ,有 \(a_1\leq avg_1\leq a_{n-2}\)。原式就变为 \(a_n<(2·avg_1+(n?3) · a_n?1)/(n?1)\) 。
设不等式右侧为 \(avg_2\) 有 \(avg_1≤avg_2≤a_{n?1}\) 。与我们所设的相矛盾,故假设不成立。
证毕。
细节处理:
- 注意精度与类型转换带来的问题。
代码
#include
#include
using namespace std;
int main(){
int T; scanf("%d",&T);
while(T--){
int n; scanf("%d",&n);
double a,mx=-2e9,sum=0.00000000;
double ans=0.0000000000;
for(int i=1;i<=n;i++){
scanf("%lf",&a);
sum+=a;
mx=max(a,mx);
}
sum-=mx;
ans=sum/(n-1)*1.00000000000+mx;
printf("%.9lf\n",ans);
}
return 0;
}