题解
【基础】第n盆花是什么颜色?
1 条题解
-
0
解题思路
有 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 盆重新开始
步骤:
- 用取模把 n 折算到周期内:p = (n-1) % (2×(3m-1)) + 1
- 判断这个位置对应第几盆:
- 如果 p ≤ 3m,就是第 p 盆(正向)
- 如果 p > 3m,往回数,对应第 2×3m-p 盆
- 盆号对 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