比赛的冠亚季军

标题:比赛的冠亚季军 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限
有N(3<=N<10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮;实力值大的获胜,实力值相等的情况,id小的情况下获胜;,轮空的直接进入下一轮.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[]s = scan.nextLine().split(" ");
        scan.close();

        int[] ability = Arrays.stream(s).mapToInt(Integer::valueOf).toArray(), ids = new int[ability.length];

        for (int i = 0; i < ids.length; i++) {
            ids[i] = i;
        }

        if (ability.length == 3) {
            while (true) {
                boolean guard = false;
                for (int i = 0; i < ability.length-1; i++) {
                    if (ability[i] < ability[i+1]) {
                        int tmp = ability[i];
                        ability[i] = ability[i+1];
                        ability[i+1] = tmp;

                        tmp = ids[i];
                        ids[i] = ids[i+1];
                        ids[i+1] = tmp;

                        guard = true;
                    }
                }
                if (!guard) {
                    break;
                }
            }
            System.out.println(String.join(" ", Arrays.stream(getRes(ability, ids)).mapToObj(String::valueOf).toArray(String[]::new)));
            System.out.println(String.join(" ", Arrays.stream(getRes(ability, ids)).mapToObj(String::valueOf).toArray(String[]::new)));

            System.out.println(String.join(" ", Arrays.stream(getRes(ability, ids)).mapToObj(String::valueOf).toArray(String[]::new)));
            return;
        }


        while (ability.length > 4) {
            int length = (int)Math.ceil((double)ability.length/2);
            int[] abilityTmp = new int[length], idsTmp = new int[length];

            if (ability.length % 2 == 1) {
                abilityTmp[length-1] = ability[ability.length-1];
                idsTmp[length-1] = ids[ids.length-1];
                length--;
            }

            for (int i = 0; i < length; i++) {
                if (ability[i*2] >= ability[i*2+1]) {
                    abilityTmp[i] = ability[i*2];
                    idsTmp[i] = ids[i*2];
                } else {
                    abilityTmp[i] = ability[i*2+1];
                    idsTmp[i] = ids[i*2+1];
                }
            }

            ability = abilityTmp;
            ids = idsTmp;
        }
        System.out.println(String.join(" ", Arrays.stream(getRes(ability, ids)).mapToObj(String::valueOf).toArray(String[]::new)));
    }

    static int[] getRes(int[] ability, int[] ids) {
        if (ability.length == 3){
            while (true) {
                boolean guard = false;
                for (int i = 0; i < ability.length-1; i++) {
                    if (ability[i] < ability[i+1]) {
                        int tmp = ability[i];
                        ability[i] = ability[i+1];
                        ability[i+1] = tmp;

                        tmp = ids[i];
                        ids[i] = ids[i+1];
                        ids[i+1] = tmp;

                        guard = true;
                    }
                }
                if (!guard) {
                    break;
                }
            }
            return ids;
        } else if (ability.length == 4){
            int[] indexWin = new int[2], indexLoss = new int[2], res = new int[3];
            for (int i = 0; i < ability.length / 2; i++) {
                if (ability[i*2] >= ability[i*2+1]) {
                    indexWin[i] = i*2;
                    indexLoss[i] = i*2+1;
                } else {
                    indexWin[i] = i*2+1;
                    indexLoss[i] = i*2;
                }
            }
            if (ability[indexWin[0]] >= ability[indexWin[1]]) {
                res[0] = ids[indexWin[0]];
                res[1] = ids[indexWin[1]];
            } else {
                res[0] = ids[indexWin[1]];
                res[1] = ids[indexWin[0]];
            }

            if (ability[indexLoss[0]] >= ability[indexLoss[1]]) {
                res[2] = ids[indexLoss[0]];
            } else {
                res[2] = ids[indexLoss[1]];
            }
            return res;
        }
        return null;
    }
}


全部评论

相关推荐

叁六玖:你看,最后不是让你加油,就是鼓励你,还祝福你求职顺利。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务