CodeM Qualifying Match Q2
问题描述:
组委会正在为美团点评CodeM大赛的决赛设计新赛制。
比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛、复赛的成绩,会有不同的积分。
比赛采取锦标赛赛制,分轮次进行,设某一轮有 m 个人参加,那么参赛者会被分为 m/2 组,每组恰好 2 人,m/2 组的人分别厮杀。
我们假定积分高的人肯定获胜,若积分一样,则随机产生获胜者。获胜者获得参加下一轮的资格,输的人被淘汰。
重复这个过程,直至决出冠军。
现在请问,参赛者小美最多可以活到第几轮(初始为第0轮)?输入描述:
第一行一个整数 n (1≤n≤ 2^20),表示参加比赛的总人数。
接下来 n 个数字(数字范围:-1000000…1000000),表示每个参赛者的积分。
小美是第一个参赛者。输出描述:
小美最多参赛的轮次。输入例子:
4
4 1 2 3输出例子:
2
完整判断版,但仅有case10%通过
1 import java.util.Scanner; 2 3 public class Main_2 4 { 5 public static void main(String arg[]) 6 { 7 Scanner sc = new Scanner(System.in); 8 int num = sc.nextInt(); 9 int points[] = new int[num]; 10 for(int i=0;i<num;i++) 11 { 12 points[i]=sc.nextInt(); 13 } 14 double turn=num/2; 15 double random=0; 16 int xm_win=0; 17 label: 18 while(turn>=1) 19 { 20 int win=0; 21 for(int k=0;k<(turn*2);k +=2) 22 { 23 random= Math.random(); 24 if((k==0 && points[0]<points[1]) || (k==0 && points[0]==points[1] && random>0.5)) 25 { 26 break label; 27 } 28 if (points[k]<points[k+1]) 29 { 30 points[win]=points[k+1]; 31 } 32 else if (points[k]>=points[k+1]) 33 { 34 points[win]=points[k]; 35 } 36 else //(points[k] == points[k+1]) 37 { 38 if(random>0.5) //random大于0.5后者赢 39 { 40 points[win]=points[k+1]; 41 } 42 else //random小于0.5前者赢 43 { 44 points[win]=points[k]; 45 } 46 } 47 System.out.println("point" + win +" "+ points[win] +" "+ "random:" + random); 48 win++; 49 } 50 System.out.println(); 51 xm_win++; 52 turn =turn/2; 53 } 54 System.out.println(xm_win); //要求输出点 55 System.out.println(num + " " + turn + " " + random); 56 } 57 }
偷工减料判断版,但仅有case10%通过
1 import java.util.Scanner; 2 3 public class Main 4 { 5 public static void main(String arg[]) 6 { 7 Scanner sc = new Scanner(System.in); 8 int num = sc.nextInt(); 9 int points[] = new int[num]; 10 for(int i=0;i<num;i++) 11 { 12 points[i]=sc.nextInt(); 13 } 14 double turn=num/2; 15 double random=0; 16 int xm_win=0; 17 label: 18 while(turn>=1) 19 { 20 int win=0; 21 for(int k=0;k<(turn*2);k +=2) 22 { 23 random= Math.random(); 24 if((k==0 && points[0]<points[1]) || (k==0 && points[0]==points[1] && random>0.5)) 25 { 26 break label; 27 } 28 if (points[k]<points[k+1]) 29 { 30 points[win]=points[k+1]; 31 } 32 else 33 { 34 points[win]=points[k]; 35 } 36 System.out.println("point" + win +" "+ points[win] +" "+ "random:" + random); 37 win++; 38 } 39 System.out.println(); 40 xm_win++; 41 turn =turn/2; 42 } 43 System.out.println(xm_win); //要求输出点 44 System.out.println(num + " " + turn + " " + random); 45 } 46 }