【发布时间】:2015-07-23 14:00:08
【问题描述】:
在 N 名球员参加的网球锦标赛中,每个球员都与其他球员一起比赛。 以下条件始终成立- 如果玩家 P1 赢得了与 P2 的比赛并且玩家 P2 赢得了 P3,那么玩家 P1 也击败了 P3。 在 O(N) 时间和 O(1) 空间中找到锦标赛的获胜者。在 O(NlogN) 时间内查找玩家排名。 我的解决方案: 输入是一个布尔矩阵,其中元素 matrix[i][j] 表示玩家 i 是否赢得玩家 j。
bool win[][]= {
{0, 0, 1, 1, 1, 0, 1},
{1, 0, 1, 1, 1, 1, 1},
{0, 0, 0, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{1, 0, 1, 1, 1, 0, 1},
{0, 0, 1, 1, 1, 0, 0}
};
所以可以像这样找到获胜者,
int winner = 0;
for (int i = 1; i < PLAYER_COUNT; ++i) {
if (win[i][winner])
winner = i;
}
return winner;
为了获得玩家的排名,我想拓扑排序会是一个不错的选择。如果玩家 1 赢得玩家 2,则添加一条边,例如这个 P1-> P2。如果玩家 1 在这里获胜,那么它对所有其他玩家都有优势。然后以获胜者为源顶点的拓扑排序,将给出玩家的排名。 我的解决方案正确吗?还有其他有效的解决方案吗?任何帮助都会很棒,在此先感谢。
【问题讨论】:
-
显示您的代码。如果有 特定 错误,请随时询问。这不是“做我的功课”、代码审查或教程网站。
-
你提到的永远成立的条件太强了。这个条件将使玩家赢得所有人。这应该是您的搜索功能的标准。根据我的眼球,在这种情况下,它是 2 号玩家。
-
另外:C 和 C++ 是不同的语言。
-
我认为这是一个理想的世界,每个玩家都有一个可量化的技能水平,更好的玩家总是获胜,从而消除了真实数据的大部分复杂性。
-
@Jefffrey 您不必遍历整个矩阵。你从随机玩家开始,然后找到赢得那个人的人,然后迭代,直到你找不到任何人赢得他。我认为它确实闻起来 O(n)。
标签: c++ c algorithm data-structures