谷歌笔试:已知实力对比关系和出场顺序,输出比赛名次

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,求出result。

 

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

stack<int> Result(int w[][100], int n, vector<int> order)
{
	stack<int> result;//用此栈存储名次
	
	vector<int>::size_type i=0;
	while(result.size()<n)
	{
		
		vector<int>::iterator iter=order.begin();
		if(order.size()==1)//如果只剩下一个,那么这个就是第一名了,进栈,全部比赛结束
		{
			result.push(*iter);
			break;
		}
		i=0;
		vector<int> ordertemp;
		while(i < order.size())
		{
			if(i!=order.size()-1)//此情况相当于本轮比赛的队伍数为偶数的情况
			{
				if(w[*iter][*(iter+1)]==*iter)
				{
					ordertemp.push_back(*iter);//赢的进下一轮比赛
					result.push(*(iter+1));//输的进栈
				}
				else
				{
					ordertemp.push_back(*(iter+1));
					result.push(*iter);
				}		
				i+=2;
				iter+=2;				
			}
			else//此情况相当于本轮比赛的队伍数为奇数的情况,最后一支队伍,没有别的队和它比,直接进下一轮比赛
			{
				ordertemp.push_back(*iter);
				break;
			}				
		}
		
		order=ordertemp;//更新队伍
	}
	
	
	return result;
}

void main()
{
	int n;
	cout<<"请输入参赛对数:";
	cin>>n;

	int w[100][100];
	cout<<"请输入实力对比关系:"<<endl;
	
	for(int i=0; i<n; i++)
		for(int j=0; j<n; j++)
			cin>>w[i][j];
		
	int ord;
	vector<int> order;
	cout<<"请输入出场顺序:";
	for(i=1; i<=n; i++)
	{
		cin>>ord;
    	order.push_back(ord);
	}	
	
	stack<int> result=Result(w, n, order);
	cout<<"比赛名次(从前到后):";
	while(!result.empty())
	{
		cout<<result.top()<<" ";
		result.pop();
	}
	
}


测试用例:temp2 > temp1 > temp3 > temp0 > temp4 > temp5

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值