题解 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 \]

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

然后我们设 \(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;
}