CF1557A 题解

· · 题解

题意描述

## 数据规模 $1 \leqslant t \leqslant 10^3$,$2 \leqslant n \leqslant 10^5$,$-10^9 \leqslant a_i \leqslant 10^9

思路

通过手算,不难发现当将最大的数单独一组时,平均值最大

证明

假设 a 数组已经从小到大排列,即存在 a_1 \leqslant a_2 \leqslant \dots \leqslant a_{n-1} \leqslant a_n

引理1:平均值的大小 average 介于数列最大值和最小值之间,设 average 为数组 a 的平均值,则存在

a_1 \leqslant average \leqslant a_n

如果不将 a_n 单独一组,那么当前的 ans 一定可以表示为:

\dfrac{\sum_{i=1}^{n-1}a_i-\sum_{i=1}^{m}a_{x_i}}{n-m-1}+\dfrac{\sum_{i=1}^{m}a_{x_i}+a_n}{m+1}\;\;(0<m<n-1)

因为可能包含重复的元素,考虑当 a 数组由单个元素重复多次构成时,分组的状态就不会对 ans 产生影响,即 ans 是一个定值

所以就要证明:

\dfrac{\sum_{i=1}^{n-1}a_i}{n-1}+a_n\geqslant\dfrac{\sum_{i=1}^{n-1}a_i-\sum_{i=1}^{m}a_{x_i}}{n-m-1}+\dfrac{\sum_{i=1}^{m}a_{x_i}+a_n}{m+1}

移项后,得:

a_n\geqslant\dfrac{\sum_{i=1}^{n-1}a_i-\sum_{i=1}^{m}a_{x_i}}{n-m-1}-\dfrac{\sum_{i=1}^{n-1}a_i}{n-1}+\dfrac{\sum_{i=1}^{m}a_{x_i}+a_n}{m+1}

即:

a_n\geqslant\dfrac{\sum_{i=1}^{n-1}a_i}{n-m-1}-\dfrac{\sum_{i=1}^{n-1}a_i}{n-1}+\dfrac{\sum_{i=1}^{m}a_{x_i}}{m+1}-\dfrac{\sum_{i=1}^{m}a_{x_i}}{n-m-1}+\dfrac{a_n}{m+1}

合并同类项后,得:

a_n\geqslant\dfrac{m\sum_{i=1}^{n-1}a_i}{(n-1)(n-m-1)}+\dfrac{(n-2m-2)\sum_{i=1}^{m}a_{x_i}}{(m+1)(n-m-1)}+\dfrac{a_n}{m+1}

移项后,得:

\dfrac{ma_n}{m+1}\geqslant\dfrac{m\sum_{i=1}^{n-1}a_i}{(n-1)(n-m-1)}+\dfrac{(n-2m-2)\sum_{i=1}^{m}a_{x_i}}{(m+1)(n-m-1)}

两边同时乘 (m+1),得:

ma_n\geqslant\dfrac{m(m+1)\sum_{i=1}^{n-1}a_i}{(n-1)(n-m-1)}+\dfrac{(n-2m-2)\sum_{i=1}^{m}a_{x_i}}{n-m-1}

通分后得:

ma_n\geqslant\dfrac{m(m+1)\sum_{i=1}^{n-1}a_i}{(n-1)(n-m-1)}+\dfrac{(n-1)(n-2m-2)\sum_{i=1}^{m}a_{x_i}}{(n-1)(n-m-1)}

合并后,得:

ma_n\geqslant\dfrac{m(m+1)\sum_{i=1}^{n-1}a_i+(n-1)(n-2m-2)\sum_{i=1}^{m}a_{x_i}}{(n-1)(n-m-1)}

两边同除 m 得:

a_n\geqslant\dfrac{m(m+1)\sum_{i=1}^{n-1}a_i+(n-1)(n-2m-2)\sum_{i=1}^{m}a_{x_i}}{m(n-1)(n-m-1)}

先分析一下分子上有多少个元素:

一共有 m(m+1)(n-1)+(n-1)(n-2m-2)m 个元素

也就是 m(n-1)(m+1)+m(n-1)(n-2m-2)

合并后,只有 m(n-1)(m-n-1) 个元素

而分母也为 m(n-1)(n-m-1)

所以相当于对分子求一个平均值 avg'

式子就化为:

a_n\geqslant avg'

而分子由 a_1,a_2,a_3,\dots,a_{n-1} 一共 n-1 种不同元素重复多次构成

则根据上文的引理1,可得:

a_1\leqslant avg' \leqslant a_{n-1}

又因为 a 数组已经排序,所以 a_n\geqslant a_{n-1}

a_n\geqslant avg'

证毕

附比赛AC代码:

P.S. printf 函数自动输出 double 时默认输出 6 位,而 cout 则会有神奇的四舍五入,且默认最大长度只有 4

#include<bits/stdc++.h>
using namespace std;
double ans1,ans2;
int t,n;
long long maxn,sum,x;
int main(){
    scanf("%d",&t);
    while(t--){
        sum=0;maxn=-1e10;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&x);
            maxn=max(maxn,x);
            sum+=x;
        }
        sum-=maxn;
        ans1=sum*1.0/(n-1);
        printf("%f\n",ans1+maxn*1.0);
    }
}