题目描述:
牛牛举办了一次编程比赛,参加比赛的有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);
}
}