AcWing 1235. 付账问题
原题链接
中等
作者:
戾儿
,
2021-03-27 18:42:23
,
所有人可见
,
阅读 322
(贪心)
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N=500010;
int n;
double a[N],s;
double ave,aves;//ave为总数的平均数 aves为剩余总数的平均值
int main()
{
cin>>n>>s;
double sum=0,ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
ave=s/n;aves=ave;//初始aves为ave
sort(a+1,a+n+1);//把钱数排序
for(int i=1;i<=n;i++)
{
if(a[i]<=aves)
{
s-=a[i];
aves=s/(n-i);//更新剩余总数的平均值
ans=ans+(a[i]-ave)*(a[i]-ave);
}
else//剩余数都是比平均数大的值
{
ans=ans+(aves-ave)*(aves-ave)*(n-i+1);
break;
}
}
double res=sqrt(ans/n);
printf("%.4lf",res);
return 0;
}