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 }

 

posted @ 2017-06-17 12:01  头头头头头头大  阅读(176)  评论(0编辑  收藏  举报