比赛的冠亚季军

比赛的冠亚季军

标题:比赛的冠亚季军 | 时间限制: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;

}

}

提示 订阅专刊 全部评论 推荐最新楼层 暂无评论,快来抢首评~