问题
结论与证明
结论:钱等于平均值的同学就交平均值的钱即可,钱少于平均值的同学需要交全部的钱,钱多余平均值的同学需要均摊钱少于平均值的同学少交的那一部分钱
证明:标准差是一个衡量数据离散程度的统计量,用上述方法可以使数据的离散程度最接近平均值,因此离散程度最小。严格证明可以使用均值不等式进行证明
代码
#include <bits/stdc++.h>
using namespace std;
const int N=5*1e5+10;
int a[N];
int main()
{
int n;
double s;
scanf("%d%lf",&n,&s);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n); //确保补钱的同学比之前钱不够的同学有钱
double res=0,ave=s/n;
for(int i=0;i<n;i++) //贪心,每次只针对当前这个人考虑
{
double temp=s/(n-i);
if(a[i]<temp) temp=a[i];
res+=(temp-ave)*(temp-ave);
s-=temp;
}
res=sqrt(res/n);
printf("%.4lf\n",res);
return 0;
}