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;

  • 相关阅读:
    webdav srs相关
    How To Configure WebDAV Access with Apache on Ubuntu 14.04
    ubuntu 编译lighttpd
    srs编译及推流测试
    Compile pciutils (lspci, setpci) in Windows x86,在 Windows x86 平台下编译 pciutils (lspci, setpci)
    mingw MSYS2 区别
    Qt之美(三):隐式共享
    Qt之美(二):元对象
    Qt之美(一):d指针/p指针详解
    C++的栈空间和堆空间
  • 原文地址:https://www.cnblogs.com/wucg/p/1858260.html
Copyright © 2011-2022 走看看