优化这段代码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)); } }
时间: 2023-05-26 12:04:21 浏览: 121
As an AI language model, I do not have any emotions and cannot express feelings. "Null" is a term used in computer programming to represent an empty or undefined value.
相关问题
public class Test{ static long sum = 0; //结果 static long fac = 0;//每个数的阶乘 public static void main(String[] args) { long sum = 0; long fac = 1; for(int i=1; i<=10; i++) { ; ; } System.out.println(sum); } }
该程序的作用是计算1~10的阶乘之和。
程序中的变量说明:
- sum:结果,即1!+2!+3!+...+10!
- fac:每个数的阶乘
程序中的for循环用于计算1~10的阶乘,并将每个数的阶乘累加到变量sum中。具体操作如下:
```java
for(int i=1; i<=10; i++) {
fac *= i; //计算i的阶乘
sum += fac; //将i的阶乘累加到sum中
}
```
最终,程序输出变量sum的值,即1!+2!+3!+...+10!的结果。
import java.util.Arrays; import java.util.Scanner; public class 1726 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[]x=new int[n]; int[]y=new int[n]; for (int i = 0; i < n; i++) { x[i]=sc.nextInt(); y[i]=sc.nextInt(); } Arrays.sort(x); Arrays.sort(y); long sum=0; long temp; for (int i = 0; i < n-1; i++) { temp=(x[i+1]-x[i]+y[i+1]-y[i]); temp*=i+1; temp*=n-i-1; sum+=temp*2; } long result=sum/n/(n-1); System.out.println(result); } }解释这段代码并说出他的计算复杂度
这段代码实现的功能是计算平面上n个点两两之间的曼哈顿距离的平均值。其中,曼哈顿距离指两点在一个矩形网格中沿网格线行走的距离。
代码中首先通过Scanner读入n个点的坐标,并分别将所有点的x坐标和y坐标分别存储在x数组和y数组中。然后分别对x数组和y数组进行排序,以方便后续的计算。接着,通过两层循环遍历所有点对,计算出每对点之间的曼哈顿距离,并将每对点的贡献乘上该点在所有点中的排名和剩余点数的乘积,最终将所有点对的贡献相加得到总和sum。最后,将sum除以n*(n-1)即可得到所求的平均值。
代码的时间复杂度为O(nlogn+n^2),其中排序的时间复杂度为O(nlogn),计算曼哈顿距离的时间复杂度为O(n^2),因此总的时间复杂度为O(nlogn+n^2)。
阅读全文