top1编程
← 返回题目
题解

【基础】第n盆花是什么颜色?

1 条题解

  • 0
    @ 2026-7-31 14:39:28

    解题思路

    有 m 组花,每组 3 盆(蓝、黄、红),一共 3m 盆。从第一盆开始数,数到最后一盆就倒回来往前数。要问数到第 n 时是什么颜色的花。

    思路:把来回数数转成位置计算。

    数数的顺序是这样的:1, 2, 3, ……, 3m, 3m-1, ……, 2, 1, 2, ……

    可以发现这是一个来回绕的循环,周期是 2×(3m-1):

    • 从第 1 盆数到第 3m 盆(共 3m 个数)
    • 再往回数到第 2 盆(共 3m-2 个数)
    • 一共 2×(3m-1) 个位置,然后回到第 1 盆重新开始

    步骤:

    1. 用取模把 n 折算到周期内:p = (n-1) % (2×(3m-1)) + 1
    2. 判断这个位置对应第几盆:
      • 如果 p ≤ 3m,就是第 p 盆(正向)
      • 如果 p > 3m,往回数,对应第 2×3m-p 盆
    3. 盆号对 3 取余定颜色:1 蓝、2 黄、0 红

    举例 m=3,n=10:

    • 周期 2×(9-1)=16,p = 9%16+1 = 10
    • 10 > 9,往回数,对应第 18-10=8 盆
    • 8%3=2 → 黄

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int m, n;
        cin >> m >> n;
    
        int total = 3 * m;
        // 折算到来回循环的周期内
        long long p = (n - 1) % (2LL * (total - 1)) + 1;
    
        int pos;
        if (p <= total) {
            pos = p;
        } else {
            pos = 2 * total - p;  // 往回数
        }
    
        // 盆号 % 3:1 蓝 2 黄 0 红
        if (pos % 3 == 1) cout << "lan";
        else if (pos % 3 == 2) cout << "huang";
        else cout << "hong";
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(1),直接用公式计算
    • 空间复杂度:O(1)
    • 1