每天学习一算法系列(33)(n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强)
2011-08-30 17:32
495 查看
题目:
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。
思路一:
题目说明很多,但是其实具体做法还是蛮简单的,其实最主要的是用来存储实力的二维数组的创建,从这个二维数组中已经可以确定实力最好的队伍,然后根据出场顺序再确定具体排名。主要看的懂题目就会明白它的做法,不用在多说了,具体看代码.
代码如下:
运行结果如下图所示:
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。
思路一:
题目说明很多,但是其实具体做法还是蛮简单的,其实最主要的是用来存储实力的二维数组的创建,从这个二维数组中已经可以确定实力最好的队伍,然后根据出场顺序再确定具体排名。主要看的懂题目就会明白它的做法,不用在多说了,具体看代码.
代码如下:
/*---------------------------- 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* ; assert(*ppW); for (int i32I = 0; i32I < n; i32I++) { ppW[i32I] = new int ; assert(ppW); for (int i32J = 0; i32J < n; i32J++) cin >> ppW[i32I][i32J]; } int *pOrder = new int ; assert(pOrder); cout << "请输入出场顺序" << endl; for (int i32I = 0; i32I < n; i32I++) cin >> pOrder[i32I]; int *pRes = new int ; 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; }
运行结果如下图所示:
相关文章推荐
- 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,已知它们之间的实力对比关系,
- n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系和出场顺序,求最终排名
- 每天学习一算法系列(14) (输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字)
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
- 每天学习一算法系列(17)(在一个字符串中找到第一个只出现一次的字符)
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
- 每天学习一算法系列(26)(输入一个整数,求该整数的二进制表达中有多少个1)
- 每天学习一算法系列(23)(写一个程序,要求功能,求出用1、2、5这三个数不同个数组合的和为100的组合数)
- 每天学习一算法系列(25)(一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。)
- 每天学习一算法系列(13) (输入一个单向链表,输出该链表中倒数第k个结点)
- 每天学习一算法系列(20)(输入一个表示整数的字符串,把该字符串转换成整数并输出)
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- 每天学习一算法系列(5)(已知两个数组,数组里的元素有正有负,但是都是按照从小到大已经排好序,要求用尽可能小的时间复杂度编写一算法求出两个数组的最大交集)
- 谷歌笔试:已知实力对比关系和出场顺序,输出比赛名次