贪心题,比较有思维难度,代码实现比较简单,应该注意逐渐推出结论的过程
#include<bits/stdc++.h>
using namespace std;
#define db long double
const int N = 500010;
int a[N];
int n;
db s;
db b[N];
db ans, avg;
int main()
{
cin>>n>>s;
for(int i = 0; i < n; i ++ ){
cin>>a[i];
}
sort(a, a + n);
avg = s / n;
//思路:让每个人带的钱排序,每个人交的钱越接近平均数,总方差之和就越小,不断计算每个人
//不断计算每个人交的钱,然后让总钱数减去这个数,不断更新平均数
//然后根据平均数判断下一个遍历到的人应该交多少
for(int i = 0; i < n; i ++ ){
db cur = s / (n - i); //不断计算出后面的平均数
if(a[i] < cur){ //如果这个人带的钱不够平均钱,就全交
cur = a[i];
}
ans += (cur - avg) * (cur - avg);
s -= cur;
}
printf("%.4Lf", sqrt(ans / n));
return 0;
}