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