这是一道想出来就ac,想不出来就0分的贪心题,贪心策略如下:
为了得到标准差最小,即使每个人付的钱相差最小。若每个人带的钱都大于等于平均值时,标准差为0;但当某人带的钱少于平均值时,则使其付自己全部的钱,剩下的钱由剩下的人均摊,直到最后钱付清为止.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, s;
int main()
{
double r = 0.0;
scanf( "%d %d", &n, &s);
double avg = (double)s/n; int x[n]; //整体平均值
double lavg = avg, ls = s; //剩余部分平均值&应付款
for( int i=0; i<n; i++) {
scanf( "%d", &x[i]);
}
std::sort( x, x+n); //qsort,顺序计算应付款
for( int i=0; i<n; i++) {
if( x[i]<=lavg) {
r+=(avg-x[i])*(avg-x[i]);
ls-=x[i]; //剩余要付的钱
lavg=ls/(n-i-1); //剩余人均摊
}
else {
r+=(avg-lavg)*(avg-lavg);
ls-=lavg; //剩余要付的钱
}
}
printf( "%.4lf", sqrt(r/n));
return 0;
}
你好,这行 lavg=ls/(n-i-1); 如果当 i = n - 1 的时候分母为0 ,不需要特判一下吗?
咦,这个问题问的很好呢,之前没想到hhh,确实特判下会更好~