zoukankan      html  css  js  c++  java
  • google面试题,loser team

    #include <iostream>
    /*
    1.
    n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,
    存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支
    所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,
    比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。
     胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,
    下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名
    编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result[n],求出result
    */
    using namespace std;
    void sort_team(
                   int * result,    /*结果*/
                   int * order,     /*比赛顺序*/
                   int** w1 ,       /*队伍实力对比*/
                   int begin,       /*开始下标*/
                   int end,         /*结束下标*/
                   int TEAM_NUM     /*队伍数目*/
                   )
    {
        int (*w)[TEAM_NUM] =(int (*)[TEAM_NUM] ) w1;
        int len=end-begin+1;
        if(len<2)return;
        int *p_tmp=new int[len];    //比赛顺序的临时copy
        //将比较顺序复制到临时存储
        for(int i=0;i<len;i++){
            p_tmp[i]=order[begin+i];
        }
        int i=0, idx=0;
        for(;i<len-1;i+=2 , ++idx){
            if(w[ p_tmp[i] ][ p_tmp[i+1] ]==p_tmp[i]){  //第一队赢
                result[begin+idx]=p_tmp[i];
                //败的一队排到最后,因为“同一轮淘汰的所有队伍排名不再细分,即可以随便排”
                result[end-idx]=p_tmp[i+1];
            }
            else{   //第二队赢
                result[begin+idx]=p_tmp[i+1];
                result[end-idx]=p_tmp[i];
            }
        }
        //最后一队落单,让赢的队再与其比赛一次
        if(i==len-1){
            if(w[ result[begin+idx-1] ][ p_tmp[i] ] == p_tmp[i] ){
                result[begin+idx]=result[begin+idx-1];
                result[begin+idx-1]=p_tmp[i];
            }
            else{
                result[begin+idx]=p_tmp[i];
            }
        }
        delete [] p_tmp;
        if( idx > begin+1 ) sort_team(result, result,  w1 , begin,  idx - 1 ,TEAM_NUM ); //递归,在胜利的队伍分区继续比赛
    }
    int main()
    {
        //team 2>team 1>team 3>team 0>team 4>team 5
        int w[6][6] = {
            {0,1,2,3,0,0},    /*0队*/
            {1,1,2,1,1,1},    /*1队*/
            {2,2,2,2,2,2},    /*2队*/
            {3,1,2,3,3,3},    /*3队*/
            {0,1,2,3,4,4},    /*4队*/
            {0,1,2,3,4,5}     /*5队*/
        };
        int order[6] = {1,3,4,2,0,5};
        int result[6]={0,};
        int len=sizeof(order)/sizeof(*order);
        sort_team(result, order , (int **) w, 0 , len -1 , len );
        for(int i=0;i<len;i++){
            cout<<result[i]<<",";
        }
        cout<<endl;
        return 0;
    }
    
    

    int (*)[NUM] 与 int *[NUM] 区别:

    数组指针,指针数组

    前一个的本质是指针,后一个的本质是数组

      int (*w)[TEAM_NUM] =(int (*)[TEAM_NUM] ) w1;

  • 相关阅读:
    HTTP-Headers-And-Tricks
    Burp减少干扰
    HTTP 请求低位三连的解决办法
    apk 脱壳 报错:Failed to spawn: unable to access zygote64 while preparing for app launch; try disablin...
    mysql 如何分批 读取数据
    记录一次问题排查
    navicat打开几秒后就自动关闭
    1013 Battle Over Cities (25 分)
    1012 The Best Rank (25 分)
    1011 World Cup Betting (20 分)
  • 原文地址:https://www.cnblogs.com/wucg/p/1858260.html
Copyright © 2011-2022 走看看