题解:洛谷 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

【核心思想】

  1. 问题分析:给定正整数 \(N\),按照规则变换直到变为 \(1\):奇数时 \(N \to 3N + 1\),偶数时 \(N \to N / 2\)。求变换次数(得分)。这是经典的Collatz猜想(冰雹猜想)的模拟问题。

  2. 算法选择

    • 直接模拟:按照规则逐步变换 \(N\),每步计数,直到 \(N = 1\) 终止
  3. 关键步骤

    • 初始化:读取 \(N\),得分 \(\text{ans} = 0\)
    • 循环变换(当 \(N \neq 1\) 时):
      • 奇数判定:若 \(N \bmod 2 = 1\),则 \(N = 3N + 1\)\(\text{ans}++\)
      • 偶数判定:否则 \(N = N / 2\)\(\text{ans}++\)
    • 输出答案\(\text{ans}\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(T)\)\(T\) 为变换步数,对于 \(N \leq 10^6\) 通常在几百步内收敛
    • 空间复杂度:\(O(1)\)
  5. 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
posted @ 2026-08-29 09:39  团爸讲算法  阅读(14)  评论(0)    收藏  举报