题解:洛谷 P6206 Another Cow Number Game
【题目来源】
洛谷:P6206 [USACO06OCT] Another Cow Number Game G - 洛谷
【题目描述】
奶牛们在玩一种数字游戏,Bessie 想让你帮她预测一下结果。游戏开始时,Bessie 将得到一个正整数 \(N\)。此时她的分数为 \(0\)。
奶牛们按照以下规则对 \(N\) 进行变换:
- 如果 \(N\) 是奇数,那么将它乘以 \(3\) 后再加 \(1\)。
- 如果 \(N\) 是偶数,那么将它除以 \(2\)。
数字每变换一次,Bessie 就得到 \(1\) 分。当 \(N=1\) 时,游戏结束。此时的分数就是她的最终得分。
【输入】
一行,一个整数 \(N\)。
【输出】
一行,一个整数,为 Bessie 的最终得分。
【输入样例】
5
【输出样例】
5
【核心思想】
-
问题分析:给定正整数 \(N\),按照规则变换直到变为 \(1\):奇数时 \(N \to 3N + 1\),偶数时 \(N \to N / 2\)。求变换次数(得分)。这是经典的Collatz猜想(冰雹猜想)的模拟问题。
-
算法选择:
- 直接模拟:按照规则逐步变换 \(N\),每步计数,直到 \(N = 1\) 终止
-
关键步骤:
- 初始化:读取 \(N\),得分 \(\text{ans} = 0\)
- 循环变换(当 \(N \neq 1\) 时):
- 奇数判定:若 \(N \bmod 2 = 1\),则 \(N = 3N + 1\),\(\text{ans}++\)
- 偶数判定:否则 \(N = N / 2\),\(\text{ans}++\)
- 输出答案:\(\text{ans}\)
-
时间/空间复杂度:
- 时间复杂度:\(O(T)\),\(T\) 为变换步数,对于 \(N \leq 10^6\) 通常在几百步内收敛
- 空间复杂度:\(O(1)\)
-
Collatz序列模拟的核心思想:
- 奇偶分支规则:奇数膨胀(\(3N+1\))、偶数收缩(\(N/2\)),形成"冰雹"般的上下波动
- 终止保证:Collatz猜想认为所有正整数最终都会收敛到 \(1\)(尚未被证明,但在计算机可处理范围内均成立)
- 数据范围注意:中间值可能远超初始 \(N\)(如 \(N = 999999\) 时峰值可达约 \(10^9\)),需用
long long防止溢出 - 极简模拟:无复杂算法,直接按规则迭代,利用计算机速度处理变换过程
- 适用于规则迭代、序列收敛、简单模拟类问题
【解题思路】

【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
long long n, ans=0; // n需要设置为long long,否则最后一个测试点会TLE
int main()
{
cin >> n; // 输入n
while (n!=1) { // 直到n==1退出循环
if (n%2==1) { // 如果n是奇数
n = n * 3 + 1; // 乘以3后再加1
ans++; // 每变换一次得1分
} else {
n = n / 2; // 除以2
ans++; // 每变换一次得1分
}
}
cout << ans << endl; // 打印分数
return 0;
}
【运行结果】
5
5
浙公网安备 33010602011771号