每天学习一算法系列(33)(n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强)
来源:互联网 发布:白无常电商美工教学 编辑:程序博客网 时间:2024/05/01 02:19
题目:
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。
思路一:
题目说明很多,但是其实具体做法还是蛮简单的,其实最主要的是用来存储实力的二维数组的创建,从这个二维数组中已经可以确定实力最好的队伍,然后根据出场顺序再确定具体排名。主要看的懂题目就会明白它的做法,不用在多说了,具体看代码.
代码如下:
/*----------------------------Copyright by yuucyf. 2011.08.30-----------------------------*/#include "stdafx.h"#include <iostream>#include <vector>#include <assert.h>using namespace std;bool CalcPosition(int **ppW, int *pOrder, int *pResult, int nGroup)//nGroup arg mean n x n{assert(ppW);assert(pOrder);assert(pResult);assert(nGroup > 0);int i32I = 0, i32J = 0;int nCurPos = nGroup - 1;vector<int> vectOrder;for (i32I = 0; i32I < nGroup; i32I++)vectOrder.push_back(pOrder[i32I]);while (vectOrder.size() > 1){for (vector<int>::iterator it = vectOrder.begin(); it != vectOrder.end(); ++it){if (it + 1 != vectOrder.end()){if (ppW[*it][*(it+1)] == *it){pResult[nCurPos--] = *(it+1);vectOrder.erase(it+1);}else{pResult[nCurPos--] = *it;it = vectOrder.erase(it);}}}}if (vectOrder.size() == 1)pResult[nCurPos--] = vectOrder[0];return true;}int _tmain(int argc, _TCHAR* argv[]){int n;cout << "请输入队伍数";cin >> n;cout << endl << "输入实力对比关系" << endl;int **ppW = new int* [n];assert(*ppW);for (int i32I = 0; i32I < n; i32I++){ppW[i32I] = new int [n];assert(ppW);for (int i32J = 0; i32J < n; i32J++)cin >> ppW[i32I][i32J];}int *pOrder = new int[n];assert(pOrder);cout << "请输入出场顺序" << endl;for (int i32I = 0; i32I < n; i32I++)cin >> pOrder[i32I];int *pRes = new int[n];assert(pRes);if (CalcPosition(ppW, pOrder, pRes, n)){cout << endl << "比赛名次为:(大到小)" << endl;for (int i32I = 0; i32I < n; i32I++)cout << pRes[i32I] << " ";}//don't forget to free memory...return 0;}
运行结果如下图所示:
- 每天学习一算法系列(33)(n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强)
- n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强的一支。
- n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强的一支。
- n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中。。。
- 36.n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系
- 算法习题36:n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系
- n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系和出场顺序,求最终排名
- 30. 谷歌面试题:n支队伍比赛,分别编号为0,1,2。。。。n-1
- n支队伍比赛
- n支队伍比赛
- 已知一支白菜连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该白菜第i天的
- 有n枚硬币按照0到n-1对它们进行编号,其中编号为i的硬币面额为vi,两个人轮流从剩下硬币中取出一枚硬币归自己所有,但每次取硬币的时候只能取剩下的硬币中编号最小的硬币或者编号最大的硬币,在两个都采用最
- 一个数组a[0...n-1],求a[i]-a[j]的最大值,其中i>j
- 一个数组a[0...n-1],求a[j]-a[i]的最大值,其中i<j
- 已知一个正整数N, 且N = 2i + 2j + … + 2q ,求i, j, ... q的值
- 设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1<=i,j<=n,且i<=j)在B中的位置为()
- n[i][j] <= n[i][j+1] n[i][j] <= n[i+1][j]
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天
- Android自定义标题栏
- mysql 存储过程(我自己写的第一个存储过程,支持事务管理)2
- ExtJs4的Chart
- OpenGL中查询模型视图(Model View)矩阵中的数据
- Linux下malloc/free详解
- 每天学习一算法系列(33)(n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强)
- 烦恼
- 计算K指数
- web.config设置之system.webServer 详细介绍,为网站设置默认文档
- Android Activity界面切换动画
- LayoutParams
- 开发微博Flash应用详解(转)
- HTMLParser使用详解
- 在C语言中为什么int型的取址范围为-2的15次方到2的15次方减1?