题解 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}\) 。用反证法:
假设

\[\sum ^{n−1} _{i=1} a_i/(n−1)+a_n<\sum ^{n−2} _{i=1}a_i/(n−2)+(a_{n−1}+a_n)/2 \]

化简不等式(我化简了好长时间[流泪])

image

然后我们设 \(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<cstdio>
#include<algorithm>
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;
}
posted @ 2021-08-13 15:46  Mr_think  阅读(68)  评论(0)    收藏  举报