【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 68时间19:00~ 22:00(3h)✅ 今天做了:Component注解、Mybatis配置、使用⏰ 明天计划:Lombok、Mapper映射、动态SQL📚 今日感悟:自动配置类DataSourceAutoConfiguration ,会读取properties文件,通过注解:@EnableConfigurationProperties(DataSourceProperties.cl
2
Day 19✅ 今天做了:MCP⏰ 明天计划:AI智能体构建📚 今日感悟:今天MCP问题有点多有点杂,明天找时间再捋一下。继续加油
1
Day 25✅ 今天做了:1、扇贝英语单词打卡2、英语听说读写、听力练习3、微信阅读15分钟4、编程导航学习⏰ 明天计划:待定📚 今日感悟:Keep going!
2
Day 104✅ 今天做了:学习了Java反射及快速入门⏰ 明天计划:继续学习Java反射
1
为啥codex老是提示这个啊
1
