分析
对于第 i i i 个人,假设他前面的都已经付完,那么他的期望付钱数就是他后面的(包括他)的人数除以剩余的钱数,也就是: S ′ n − i + 1 \Large \frac{S^\prime}{n-i+1} n−i+1S′,但如果第 i i i 个人没有这么多钱,他就只能付 a i a_i ai 元,最后计算标准差即可。
考试时在期望付钱数这里卡住了,其余的跟正确思路大差不差。
注意开 long double
不然会挂 30 30 30 分。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 5 * 1e5 + 5;
int n;
long double s, ans, avg, a[N];
int main(){
cin >> n >> s;
for(int i = 1; i <= n; i ++){
cin >> a[i];
}
avg = s / n;
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i ++){
long double cur = min(a[i], s / (n - i + 1));
s -= cur;
ans += (cur - avg) * (cur - avg);
}
ans /= n, ans = sqrt(ans);
cout << fixed << setprecision(4) << ans;
return 0;
}