百度笔试题-1001人参加羽毛球赛,淘汰赛,当比出第一时进行了多少场比赛

来源:互联网 发布:淘宝限时秒杀问题 编辑:程序博客网 时间:2024/04/16 22:25

题干

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

解答

总的来说,比较简单,每次只能淘汰一个人。

或者,2个人时需要1场,3人时需要2场......。这样更像一道智力题,而不是算法题


我用代码算出来了,具体算法看代码。

/*百度校园招聘笔试题  *二、算法设计:  *1.公司组织一次羽毛球比赛,采用淘汰机制,假设公司有1001个人,  *如果要评出“公司羽毛球第一高手”的称号,  *至少需要进行多少场比赛?请简述设计过程,并写出代码模拟比赛过程。   * 我的算法思想:  * 大小为1001的数组(1表示未淘汰,0表示淘汰),  * 类似于第一个与最后一个比,第一个赢,打了一场  * 第二个与倒数第二个比,第二个赢,又打了一场  *遇到下标相等的,则不比赛直接晋级。  *递归,直到只有剩一个人。  */public class test2 {  public static void main(String[] args) {// TODO Auto-generated method stubtest2 test2=new test2();//看清楚了,我new了1002个(实际只有1001),是因为我不想用player[0]这个元素int player[]=new int[1002];//有1001位player,1表示未淘汰,0表示已经淘汰int x,LiveCount,PlayerTimes; PlayerTimes=0;  for(x=1;x<=1001;x++){player[x]=1;//刚开始的时候当然所有的选手都处于未淘汰的状态  }  LiveCount=1001;//初始有1001未被淘汰  PlayerTimes=0;//初始比赛次数为0;  while(LiveCount!=1){  System.out.print("递归进行两两比赛一次,比赛前存活人数:"+LiveCount+"\n");  PlayerTimes=test2.match(player,PlayerTimes,LiveCount);  LiveCount=0;  for(x=1;x<=1001;x++){if(player[x]==1) LiveCount++;  }  }  System.out.print("\n此时已经选出了冠军!"+"存活人数为"+LiveCount+"! 一共进行了:"+PlayerTimes);}int match(int[] player, int PlayerTimes,int Livecount){int start=1;int end=Livecount;while(true){if(start>=end) break;if(player[start]==1&&player[end]==1){player[end]=0;PlayerTimes++;start++;end--;}}return PlayerTimes;}}

运算结果:

递归进行两两比赛一次,比赛前存活人数:1001
递归进行两两比赛一次,比赛前存活人数:501
递归进行两两比赛一次,比赛前存活人数:251
递归进行两两比赛一次,比赛前存活人数:126
递归进行两两比赛一次,比赛前存活人数:63
递归进行两两比赛一次,比赛前存活人数:32
递归进行两两比赛一次,比赛前存活人数:16
递归进行两两比赛一次,比赛前存活人数:8
递归进行两两比赛一次,比赛前存活人数:4
递归进行两两比赛一次,比赛前存活人数:2


此时已经选出了冠军!存活人数为1! 一共进行了:1000

原创粉丝点击