题解
狐狸与兔子
1 条题解
-
0
解题思路
狐狸从 10 号洞出发,第 1 次找的是 1 号洞;第 2 次“隔 1 个洞”,也就是往前跳过 1 个洞,即步长为 2;第 3 次“隔 2 个洞”,步长为 3;……第 t 次步长就是 t。
所以用一个变量 pos 记住狐狸当前在哪个洞: 第 t 次搜索时,pos 加上步长 t,因为洞只有 1~10 号,超出 10 号就要绕回 1 号继续数, 用公式 pos = (pos - 1) % 10 + 1 就能实现“绕圈”。
用一个标记数组记下狐狸找过的洞。兔子当然不能躲在被找过的洞里, 最后把 1~10 号洞里没有被标记的洞从小到大输出,就是兔子可以躲的地方。
验证样例 n=4:狐狸找过的洞依次是 1、3、6、10,剩下 2、4、5、7、8、9,和样例输出一致。
参考代码
// 狐狸与兔子:狐狸从10号洞出发,第1次找1号洞,之后每次多隔1个洞 // 标记狐狸找过的洞,剩下没找过的洞就是兔子能躲的地方 #include <iostream> using namespace std; bool searched[11]; int main() { int n; cin >> n; int pos = 1; // 第1次找的洞是1号 for (int t = 1; t <= n; t++) { if (t > 1) { pos = pos + t; // 第t次比上次多隔1个洞,步长为t pos = (pos - 1) % 10 + 1; // 洞只有1~10,绕圈循环 } searched[pos] = true; // 这个洞被狐狸找过 } bool first = true; for (int i = 1; i <= 10; i++) { if (!searched[i]) { // 没被找过就能躲 if (!first) cout << ' '; cout << i; first = false; } } cout << endl; return 0; }复杂度分析
模拟 n 次搜索是 O(n),最后检查 10 个洞是常数时间,总时间复杂度 O(n)。标记数组固定 10 个格子,空间复杂度 O(1)。
- 1