您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法面试题80道(36)

2016-03-15 15:42 274 查看
36.引用自网友:longzuo

谷歌笔试:

n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,

存储在一个二维数组w

中,w[i][j] 的 代表编号为i,j的队伍中更强的一支。

所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order
中,

比如order
= {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......

胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,

下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名

编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result


求出result。

#include<iostream>
#include<stdio.h>
#include<vector>
#include<assert.h>
using namespace std;

#define N 5 //队伍数

void getResult(int (*w)
,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

={{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
={4,3,1,2,0};
int result
;
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中只剩一个

数据是在网上找的,和别人的对的到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: