【MarsCode】每日一题 (模拟)之 比赛配对问题
比赛配对问题
1.问题描述
小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制:
- 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行
n / 2场比赛,且产生n / 2支队伍进入下一轮。 - 如果当前队伍数为 奇数,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行
(n - 1) / 2场比赛,且产生(n - 1) / 2 + 1支队伍进入下一轮。
小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。
测试样例
样例1:
输入:
n = 7输出:6
样例2:
输入:
n = 14输出:13
样例3:
输入:
n = 1输出:0
2.思路与题解
-
配对次数的计算逻辑:
-
当前代码中,你在每次循环中更新
count的方式可能有些问题。你需要确保每次配对的次数都被正确地累加。 -
对于偶数队伍数,配对次数应该是
n / 2,而不是n。 -
对于奇数队伍数,配对次数应该是
(n - 1) / 2,而不是(n - 1) / 2 + 1。
-
-
循环条件:
- 当前代码的循环条件是
n > 1,这是正确的,因为当n为 1 时,比赛已经结束。
- 当前代码的循环条件是
Java
▼java复制代码class Main { public static int solution(int n) { int count = 0; // 初始化配对次数 // 当队伍数大于1时,继续进行配对 while (n > 1) { // 如果队伍数为偶数 if (n % 2 == 0) { // 进行 n / 2 场比赛 n /= 2; count += n; // 更新配对次数 } else { // 如果队伍数为奇数 // 进行 (n - 1) / 2 场比赛,并有一支队伍轮空 count += (n-1)/2; n = (n - 1) / 2 + 1; } } return count; } public static void main(String[] args) { System.out.println(solution(7) == 6); System.out.println(solution(14) == 13); System.out.println(solution(1) == 0); } }
C++
▼c++复制代码#include <iostream> int solution(int n) { int count = 0; // 初始化配对次数 // 当队伍数大于1时,继续进行配对 while (n > 1) { if (n % 2 == 0) { // 如果队伍数为偶数 // 进行 n / 2 场比赛 count += n / 2; // 更新配对次数 n /= 2; // 更新队伍数 } else { // 如果队伍数为奇数 // 进行 (n - 1) / 2 场比赛,并有一支队伍轮空 count += (n - 1) / 2; // 更新配对次数 n = (n - 1) / 2 + 1; // 更新队伍数 } } return count; } int main() { std::cout << (solution(7) == 6) << std::endl; std::cout << (solution(14) == 13) << std::endl; std::cout << (solution(1) == 0) << std::endl; return 0; }
Python
▼python复制代码def solution(n): count = 0 # 初始化配对次数 # 当队伍数大于1时,继续进行配对 while n > 1: if n % 2 == 0: # 如果队伍数为偶数 # 进行 n / 2 场比赛 count += n // 2 # 更新配对次数 n //= 2 # 更新队伍数 else: # 如果队伍数为奇数 # 进行 (n - 1) / 2 场比赛,并有一支队伍轮空 count += (n - 1) // 2 # 更新配对次数 n = (n - 1) // 2 + 1 # 更新队伍数 return count print(solution(7) == 6) print(solution(14) == 13) print(solution(1) == 0)
Golang
▼go复制代码package main import "fmt" func solution(n int) int { count := 0 // 初始化配对次数 // 当队伍数大于1时,继续进行配对 for n > 1 { if n%2 == 0 { // 如果队伍数为偶数 // 进行 n / 2 场比赛 count += n / 2 // 更新配对次数 n /= 2 // 更新队伍数 } else { // 如果队伍数为奇数 // 进行 (n - 1) / 2 场比赛,并有一支队伍轮空 count += (n - 1) / 2 // 更新配对次数 n = (n - 1) / 2 + 1 // 更新队伍数 } } return count } func main() { fmt.Println(solution(7) == 6) fmt.Println(solution(14) == 13) fmt.Println(solution(1) == 0) }
2.5一些疑难的代码解释
-
偶数队伍数:
-
count += n / 2;:每次配对次数应该是n / 2。 -
n /= 2;:更新队伍数为n / 2。
-
-
奇数队伍数:
count += (n - 1) / 2;:每次配对次数应该是(n - 1) / 2。n = (n - 1) / 2 + 1;:更新队伍数为(n - 1) / 2 + 1。
3.欢迎大佬们关注或莅临本渣的一些个人website
gitee: https://gitee.com/xiao-chenago github:https://github.com/cool-icu0 语雀:https://www.yuque.com/icu0 csdn:https://cool-icu.blog.csdn.net/
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
Day 35✅ 今天做了:1、扇贝英语单词打卡2、英语听说读写、听力练习3、微信阅读15分钟4、编程导航学习⏰ 明天计划:待定📚 今日感悟:Keep going!
2
Day 113✅ 今天做了:学习了sql查询进阶⏰ 明天计划:继续学习MySQL
1
day26使用腾讯云,在云服务器上安装docker,git,nginx,大部分用agent自动完成。明天就能部署了本地部署了一遍,用docker desktop部署的。校招投了一些,毕竟是2026应届毕业生,与很多校招时间上不匹配,投了一个银行还有一些大厂这几天看了ai知识,下载ai工具,熟悉ai作业,windsurf额度用完了,trae额度还挺多的,Cursor还没使用,已经安装了。明天部署完项
3
Day 2✅ 今天做了:RAG基础剩余部分以及作业⏰ 明天计划:RAG进阶📚 今日感悟:通过云知识库可以简化开发流程
1
Day 6~7✅ 今天做了:这两天学习了[工具调用 学习进度100%,掌握进度60%] 工具调用进阶知识,注入工具上下文、立即返回等简单的设置,以及工具执行模式管理工具给client使用。[MCP协议 学习进度70%, 掌握进度40%] mcp与工具调用区别、mcp的sse和stdio的两种调用方式,学习了程序使用mcp⏰ 明天计划:mcp收尾,并实操mcp的代码编写。📚 今日感悟:学习并理解工
2
