解题思路:
第一步,先给数组排好序。

第二步,在这个数组,怎么按照题目思路,给定一个和m龙头的映射。是新建m个数组?

No,就在原有数组上做文章。

第三步,对单独一个桶,怎么处理累计时间。很容易发现,对一个龙头 arr[ 1 , 2, 3 ,4]

第一个不用等(0),第二个要等的是,前一个人的用时(1)。第三个要等的是,前两个用时和(1+2)。依次类推。


注意事项:

处理好边界!!!
巧妙处理累计,见代码。


参考代码:


import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int m = scanner.nextInt();
		int[] arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = scanner.nextInt();
		}
		Arrays.sort(arr);

		int sum = 0;
		// m个水龙头
		for (int i = 0; i < m; i++) {
			int length = (int) Math.ceil((double) (n - i) / m);
			// 每个水龙头等待的人
			int index = i;
			for (int j = 0; j < length - 1; j++) {
				// 累计时间
				sum += (length - 1 - j) * arr[index];
				index = index + m;
			}
		}
		System.out.println(sum);
	}

}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论