关键: 如何分组才能使所有队伍的水平值总和最大.
思路: 首先对数据进行排序得到一个有序的数组,然后取排序后的数组的开头一个元素,和数组末尾的两个数据分为一组,如图
排序
分组
(这样分组可以保证每一次分组时所分组的中间值是整个数组中能取当作中间值的最大值)
使用以上的分组方式后,又产生一个新的问题,那就是如何拿到每组的中间值.
解决上述问题,可以使用以下公式来解决
具体代码实现
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] array = new int[3*n];// 创建同一个大小为3*n的数组
int ret = 0; //定义一个变量来存放每组的中间值
long sum = 0; //定义一个变量来存放每组中间值的和
for (int i = 0; i < 3*n; i++) { //将3*n个元素放入数组
array[i] = scanner.nextInt();
}
Arrays.sort(array); //对数组进行升序排序
for (int i = 0; i < n; i++) { //将整个数组分为n组,取n次中间值
ret = array[array.length - 2*(i+1)]; //将当前组的中间值存入变量ret中
sum += ret; //将每一组的中间值进行累加
}
System.out.println(sum); //打印最终结果
}