数据结构与算法面试题80道(36)
36.引用自网友:longzuo
谷歌笔试:
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。
#include<iostream> #include<stdio.h> #include<vector> #include<assert.h> using namespace std; #define N 5 //队伍数 void getResult(int (*w)[N],int *order,int *result,int groupNum){ //确保程序的正确性 assert(groupNum>0); int i=0,j=0; int cur=groupNum-1;//result数组游标 vector<int>vOrder; for(i=0;i<groupNum;i++) vOrder.push_back(order[i]); while(vOrder.size()>1){ for(vector<int>::iterator it=vOrder.begin();it!=vOrder.end();it++){ if(it+1!=vOrder.end()){//防溢出 if(w[*it][*(it+1)]==*it){//赢了将it+1放进result,并移除它 result[cur--]=*(it+1); vOrder.erase(it+1); }else{//输了,呜呜,被移除 result[cur--]=*it; vOrder.erase(it); } } } } if(vOrder.size()==1) result[cur--]=vOrder[0]; } int main(){ int w[N][N]={{0,1,2,3,4},{1,1,2,3,4},{2,2,2,3,4},{3,3,3,3,4},{4,4,4,4,4}}; int order[N]={4,3,1,2,0}; int result[N]; getResult(w,order,result,N); for(int i=1;i<=N;i++)//注意,我的队伍是从1号开始的 cout<<"第"<<i<<"名为"<<result[i-1]+1<<"号队伍\n"; return 0; }
这题很简单吧,动态维护一个order,赢了就留在order,输了就放入result,知道order中只剩一个
数据是在网上找的,和别人的对的到