数组的经典算法题练习

数组的经典算法题练习

第一章 数组的经典算法题练习


数组在数据结构和算法中的应用是非常广范的

接下来,我们需要来看一看一些数组和栈的经典笔试题

提示:以下是本篇文章正文内容,下面案例可供参考

一、组队竞赛

1.链接:https://www.nowcoder.com/questionTerminal/248ccf8b479c49a98790db17251e39bb
来源:牛客网

牛牛举办了一次编程比赛,参加比赛的有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.

解题思路:
首先,我们可以观察,每一个team中的队员水平都是有大有小的,要得到最优解,就需要在每一个队中存在水平的中位数,且该中位数在所有的队员水平的中位数之上,那么如何确定中位数呢,由此我们需要对6个队员进行排序。但是分析题目,我们要水平最大值,因此需要找到第二大和第三大的数值,且这两个数不能在同一个队伍中;这样,我们就可以编写代码了!
(1)编写输入代码;
(2)排序水平;
(3)找到第二大。第三大的数。然后相加;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
    

    public static void main(String[] args) {
    
    
        Scanner input = new Scanner(System.in);
        int a[] = new int[300000];
        while (input.hasNext()) {
    
    
            int n = input.nextInt();
            for (int i = 0; i < n * 3; i++) {
    
    
                a[i] = input.nextInt();
            }
            Arrays.sort(a, 0, 3 * n);
            int end = 3 * n - 1;
            int begin = 0;
            long sum = 0;
            while (end > begin) {
    
    
                sum = sum + a[end - 1];  //每一次找到当前第二大的数
                end = end - 2; //到的剩余的值的第二大的数
                begin = begin + 1; 
            }
            System.out.println(sum);
        }
    }
}

在这里插入图片描述

总结

数组的运用需要不断的练习,巧用数组,可以解决很多抽象的问题。

猜你喜欢

转载自blog.csdn.net/ILOVEMYDEAR/article/details/115817618