1235. 付账问题
作者:
cyuyu
,
2022-02-25 23:30:20
,
所有人可见
,
阅读 150
本题使用了贪心,当然了,根据我自己的二次函数的分析,刚开始avg=s/n;如果所有人带的钱都大于avg,那么每个人都拿出和Avg这样的方差最小,为0,但如果有人带的钱不足Avg那么就拿出他自己身上带的所有的钱a[i];我只分析到这里但是后序的人怎么拿钱我就不懂了就不会写代码了,这也就是成事不足败事有余。
如果第一个人的钱不足avg,那么后序的人的avg就是(s-a[0])/(n-1),这时再看a[1]与现在的Avg的关系
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=5e5+10;
int a[N];
int n;
int main(){
cin>>n;
long double s;
cin>>s;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
long double avg=s/n;
long double res=0;
for(int i=0;i<n;i++){
long double cur=s/(n-i);
if(a[i]<cur){
cur=a[i];
}
res+=(cur-avg)*(cur-avg);
s=s-cur;
}
printf("%.4llf",sqrt(res/n));
return 0;
}