[算法]最少比赛次数

题目:

公司组织一次羽毛球比赛,采用淘汰机制,假设公司有1001个人,如果要评出“公司羽毛球第一高手”的称号,至少需要进行多少场比赛?请简述设计过程,并写出代码模拟比赛过程。

一对一的比赛,一场只能淘汰一个人,因此需要1000此比赛。

比赛过程:

View Code
 1 import java.util.ArrayList;
 2 
 3 
 4 /*
 5  * 公司组织一次羽毛球比赛,采用淘汰机制,假设公司有1001个人,如果要评出“公司羽毛球第一高手”的称号,至少需要进行多少场比赛?请简述设计过程,并写出代码模拟比赛过程
 6  * 比赛过程
 7  */
 8 public class Competition {
 9 
10     public static void main(String[] args) {
11         int n=1001;
12         ArrayList<Integer> thisRound=new ArrayList<Integer>();
13         ArrayList<Integer> nextRound=new ArrayList<Integer>();
14         int c=0;
15         
16         for(int i=0;i<n;i++){
17             thisRound.add(i+1);
18         }
19         
20         
21         shuffle(thisRound);
22         //随机选出23人,轮空
23         System.out.println("the following competitors will go into the next without competitions ");
24         for(int i=0;i<23;i++){
25             System.out.print(thisRound.get(i)+" ");
26             nextRound.add(thisRound.get(i));
27             thisRound.remove(i);
28         }
29         System.out.println();
30         do{
31             shuffle(thisRound);
32             for(int i=0;i<thisRound.size();i+=2){
33                 System.out.println("the "+(++c)+" competition:"+thisRound.get(i)+" vs "+thisRound.get(i+1));
34                 int winner=(int)Math.floor(Math.random()*10)%2==0?i:i+1;
35                 System.out.println("the "+(c)+" competition result:"+thisRound.get(winner)+" wins");
36                 nextRound.add(thisRound.get(winner));
37             }
38             thisRound=nextRound;
39             nextRound=new ArrayList<Integer>();
40         }
41         while(thisRound.size()>1);
42         System.out.println("the final winner is:"+thisRound.get(0));
43     }
44     
45     public static void shuffle(ArrayList<Integer> A){
46         for(int i=0;i<A.size();i++){
47             int r=(int) Math.floor(Math.random()*A.size());
48             int tem=A.get(r);
49             A.set(r,A.get(i));
50             A.set(i,tem);
51         }
52     }
53 }

 比赛有多种形式,淘汰赛就是1对1比,每轮淘汰一半,直到只剩下一个人。循环赛,是每个队都能和其他队比赛一次或两次,最后按成绩计算名次。第一次有23人轮空,就是为了产生第二轮512人的比赛,从而可以不再需要轮空某些队。

posted @ 2013-04-12 10:10  orchid  阅读(757)  评论(1编辑  收藏  举报