首页 > 试题广场 >

组队竞赛

[编程题]组队竞赛
  • 热度指数:10532 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛举办了一次编程比赛,参加比赛的有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.

输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.


输出描述:
输出一个整数表示所有队伍的水平值总和最大值.
示例1

输入

2
5 2 8 5 1 5

输出

10
import java.util.Scanner;
import java.util.Arrays;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int[] num = new int[3*n];
       for(int i=0;i<3*n;i++) {
        num[i] = sc.nextInt();
       }
       Arrays.sort(num);
       long res = 0;
       for(int i=0;n+2*i<3*n;i++) {
        res += num[n+2*i];
       }
       System.out.println(res);
    }
}
发表于 2023-09-14 22:42:08 回复(0)
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Long> list=new ArrayList<>();
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
long ans=0;
long a_i=0;
for(int i=0;i<3*n;i++){
a_i=sc.nextLong();
list.add(a_i);
}
Collections.sort(list);
for(int j=n;j<3*n;j=j+2){
ans+=list.get(j);
}
System.out.println(ans);
}
}

发表于 2022-11-23 11:52:43 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()){
            int n = in.nextInt();
            int[] arr = new int[3 * n];
            int len = arr.length;
            for(int i = 0; i < len; i++){
                arr[i] = in.nextInt();
            }
            Arrays.sort(arr); //递增排序
            long sum = 0;
            for(int i = 0; i < n; i++){
                sum += arr[len - 2 * (i + 1)]; //分组最低的一个人和最高的两个人分为一组 队伍水平为第二高的人的水平,
            }
            System.out.println(sum);
        }
    }
    
}

发表于 2022-10-12 09:06:49 回复(0)
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[] arr = new int[3*n];
        for(int i = 0; i < 3*n; i++) {
            arr[i] = scanner.nextInt();
        }
        Arrays.sort(arr);

        // 1、去掉前n个较小的数
        // 2、将剩下的 2*n 个数两两组合
        // 3、取每组中较小的数,求和

        long ret = 0;  // 求和长度不够
        for(int i = n; i < 3*n; i += 2) {
            ret += arr[i];
        }
        System.out.println(ret);
    }
}
	
通过全部用例 运行时间723ms 占用内存24244KB
编辑于 2022-01-19 14:16:19 回复(0)
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int  count=sc.nextInt();
        ArrayList<Long>list=new ArrayList<>();
        while(sc.hasNext()){
            long cur=sc.nextLong();
            list.add(cur);
        }
        list.sort(new Comparator<Long>() {
            @Override
            public int compare(Long o1, Long o2) {
                return (int) (o2-o1);
            }
        });

        long sum=0;
        long start=1;
        for (int i=0;i<count;i++){
            sum=sum+list.get((int) start);
            start=start+2;
        }
        System.out.println(sum);
    }
}

发表于 2021-05-23 22:05:27 回复(1)

热门推荐

通过挑战的用户