卡最后一个数据的开long double就能过了
贪心的思路,因为平均数和n是固定的,因此要尽可能的让每个人掏的钱靠近平均数,对数组排序,前半部分小于平均数的贡献自己的所有钱,后半部分大于平均数的需要付平均数并均摊前面的人欠的钱,若不够就付全部让后面的人来补
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
long double s;
cin >> n >> s;
long double avg = s / n;
vector<long double> a(n);
for (auto& v : a)
cin >> v;
sort(a.begin(),a.end());
long double cnt = 0;
long double ans = 0;
for (int i = 0; i < n; i ++)
{
if (a[i] < avg)
{
ans += (a[i] - avg) * (a[i] - avg);
cnt += avg - a[i];
}
else
{
long double t = min(a[i], cnt / (n - i) + avg);
ans += (t - avg) * (t - avg);
cnt -= (t - avg);
}
}
printf("%.4llf\n", sqrt(ans / n));
}