链接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b?orderByHotValue=1&page=1&onlyReference=false
题目描述
牛牛举办了一次编程比赛,参加比赛的有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.


解题思路:
它是要找3个队员中水平值为第二的那个人,所以我们可以先进行排序,这样就很简单的找到水平值为第二的人然后观察下标(注意下标有一个单位量的偏差)找一下规则如下图所示

看代码实现:
import java.util.*;
public classMain{
public static void main(String[] args) {
int n;
long max=0;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int[] num=new int[3*n];
for (int i = 0; i < 3 * n; i++) {
num[i] = sc.nextInt();
}
Arrays.sort(num);
for (int i = 3*n-1-1; i>=n;i-=2 ) {
max+=num[i];
}
System.out.println(max);
}
}
牛牛组织了一场编程比赛,需要将3n名选手分为n个三人队伍,每个队伍的水平值为队员中第二高的水平值。目标是最大化所有队伍的水平值总和。解题方法是先对选手按水平值排序,然后找到每个队伍中水平值第二的选手,以求得最大总和。给出的示例中,最优方案能获得10的总和。
747

被折叠的 条评论
为什么被折叠?



