【题目描述】
【思路】
贪心算法 每个人付的钱尽可能地接近平均值。当这个人钱少于当前平均钱时,就将全部钱付出,剩下的要凑的钱由后面的人均摊
AC代码
import java.lang.Math;
import java.io.*;
import java.util.Arrays;
public class Main{
static int N = 500010;
static long f[] = new long[N];
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str[] = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
double s = Double.parseDouble(str[1]);
String data[] = bf.readLine().split(" ");
for(int i = 0; i < n; i ++)
f[i] = Integer.parseInt( data[i] );
Arrays.sort(f, 0, n);
double ans = 0.0;
double avg = s / n;
//从小到大 如果有人总钱数大于平均值 就全部付掉
for(int i = 0; i < n; i ++){
double leftaver = s /(n - i);
if( f[i] >= leftaver){
ans += (leftaver - avg) * (leftaver - avg) * (n - i);
break;
}
//钱少于平均值时
s -= f[i];
ans += (f[i] - avg)*(f[i] - avg) ;
}
ans = Math.sqrt(ans / n);
System.out.println(String.format("%.4f",ans));
}
}
错误代码
不知道错在哪里 只过了一半数据
/*
10 30
平均数:s / n = 3
2 1 4 7 4 8 3 6 4 7
3
1 2 3 4 4 4 6 7 7 8
1 2 3 4 4 4 3 3 3 3
-2-1 0 +1 +1 +1
45
*/
import java.lang.Math;
import java.io.*;
import java.util.Arrays;
public class Main{
static int N = 100010;
static long f[] = new long[N];
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str[] = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
double s = Double.parseDouble(str[1]);
String data[] = bf.readLine().split(" ");
for(int i = 0; i < n; i ++)
f[i] = Integer.parseInt( data[i] );
Arrays.sort(f, 0, n);
double aver = s / n;
double t = 0.0;
double gap = 0;
/*
1 2 3 4 4 4 6 7 7 8
1 2 3 4 4 4 3 3 3 3
-2-1 0 +1 +1 +1
*/
int j = 0;
for(int i = 0; i < n; i ++)
{
if(f[i] <= aver)//f[i]尽可能地靠近平均值
{
t += (aver - f[i]) * (aver - f[i]);
gap += (aver - f[i]); //3
}else{
//第一个大于平均数的位置j
j = i;
break;
}
}
double more = gap / (n - j);//后面每个人要平摊的钱:aver + more
for(int i = j; i < n; i ++){
if( f[i] - more < aver){//不够则该人全部钱付上
t += (f[i] - aver)*(f[i] - aver);
gap += (more + aver -f[i]);
//后边的人重新分配平摊
more = gap / (n - i);
}else{
t += (n - i) * (more * more);
break;
}
}
double ans = Math.sqrt(t / n);
System.out.println(String.format("%.4f",ans));
}
}