算法1
思路:这个题,想了半天才明白代码是什么意思,贪心的思路, 那么怎么个贪心法呢?首先我们要知道标准差表示的是数据的波动程度,其值越大波动越大。要使得标准差小,我们就要尽可能使得数据都比较接近平均值。那么这题贪心策略应该是这样的:首先算出平均值s/n,把数据从小到大排序,
如果某个人的钱低于该值,那么他一定是将钱全部支付,然后其余不够的其他人平摊。但是,由于之前那个人钱不够,那么就会导致剩下人支付的平均值会增大,所以在这个平摊过程中很有可能存在某个人钱又低于这个平均值,又需要剩下的人平摊。如此反复,直到支付完成。
C++ 代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 500010;
int n;
int a[N];
int main()
{
long double s;
cin>>n>>s;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
long double res=0,ave=s/n;
for(int i=0;i<n;i++){
double cur=s/(n-i);//当前平均值
if(a[i]<cur)cur=a[i];//如果当前账户大于平均值,取平均值
res+=(cur-ave)*(cur-ave);//如果当前账户小于平均值,求相差的平方
s-=cur;
}
printf("%.4Lf\n",sqrt(res/n));
return 0;
}