1 条题解
-
2
解法一 所有 的答案都是 。
我们先来看看胜者组。请注意,该组每场比赛正好有一支球队跌入败者组。在比赛结束前,胜者组只剩下一支球队,因此在决赛前,胜者组一定进行了 场比赛。
类似的逻辑也适用于败者组。在比赛过程中,共有 支球队降入败者组。该组的两支球队每进行一场比赛,就会有一支球队被淘汰出局。在决赛前,该组只剩下一支球队,因此在决赛前,败者组一定进行了 场比赛。
最后,我们将最后一场比赛加到我们的计算中,使总数达到
#include <bits/stdc++.h> using namespace std; int main() { int n, t; cin >> t; while(t--) { cin >> n; cout << 2*n-2 << "\n"; } }``` ```解法二 或者,我们也可以直接模拟这一过程。
假设在一轮比赛之前,胜者组有 支球队,败者组有 支球队。
首先, 场比赛在败者组球队中进行,因此 场比赛在这一步被淘汰。我们从 中减去这个数字,再加上 ,就得出了比赛总数。
然后, 场比赛在胜者组球队中进行,因此 场比赛落入败者组。我们从 中减去这个数字,再加上 ,就得出了比赛总数。
如上所述,在模拟了 轮比赛后,两组都只剩下一支球队,因此我们在总场次上加上 。
时间复杂度: 。
#include <bits/stdc++.h> using namespace std; int main() { int n, t, winners, losers, ans; cin >> t; while(t--) { cin >> n; winners = n; losers = 0; ans = 0; while(max(losers, winners) > 1) { ans += losers/2; losers = (losers+1)/2; ans += winners/2; losers += winners/2; winners++; winners /= 2; } ans++; cout << ans << "\n"; } } ``` ```
信息
- ID
- 1212
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 124
- 已通过
- 31
- 上传者