组队竞赛问题-牛客(附Java源码)

题目描述:

牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10

题目解析:

先将数组排好序.取第一个值和最后两个值放到一个组里,
这样分组我们就一定会拿到一个最高值和一个仅次于最高值的值.
这个仅次于最高值的值就是我们所需要的数据.

示例一 : 1 2 5 5 5 8

在这里插入图片描述

示例二:1 2 3 4 5 6 7 8 9

在这里插入图片描述

从上面的例子中我们可以发现推导出一个公式,我们取到的值的下标为array.length-2*(i+1)
比如:
示例一:数组长度为6,我们取得数据的下标为6-2*(0+1)=4, 6-2*(1+1)=2.
示例二中:数组的长度为9,我们取得数据的下标为9-2*(0+1)=7, 9-2*(1+1)=5, 9-2*(2+1)=3.

代码如下:

import java util.*;
public class Main{
    
    
	public static void main(string[] args){
    
    
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		//创建数组
		long[] array=new long[3*n];
		for(int i=0;i<(3*n);i++){
    
    
			//给数组输入值
			array[i]=sc.nextLong();
		}
		//先对数组进行排序
		Arrays.sort(array);
		//用来记录最后输出的结果
		long sum=0;
		for(int i=0;i<n;i++){
    
    
			//array.length-2*(i+1)就是我们所需要的第二高水平值的下标.
			sum+=array[array.length-(2*(i+1))];
		}
		System.out.println(sum);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_47278183/article/details/124407270