题目描述
一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第
n
(
n
≤
20
)
n(n\le20)
n(n≤20) 天早上起来一看,只剩下
1
1
1 个桃子了。请问小猴买了几个桃子?
输入格式
无
输出格式
无
输入输出样例
输入 #1
4
输出 #1
22
解法1 递推
直接求解本题比较难,但如果从最后一天倒推回去,就简单多了。第 n n n 天剩下一个;前一天就吐出一个,然后翻倍(因为反过来是吃掉一半后又吃掉一个)……直到第一天。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf("%d", &n);
int ans = 1;
while (--n) ans = (ans + 1) * 2;
printf("%d", ans);
return 0;
}
解法2 递归
也可以从第一天编写递归函数,顺着求解,思维更加直接:
#include <bits/stdc++.h>
using namespace std;
int n;
int func(int k) { // 计算第k天有几颗桃子
if (k == n) return 1;
return (func(k + 1) + 1) * 2;
}
int main() {
scanf("%d", &n);
printf("%d", func(1));
return 0;
}
解法3 数学
下面给出
O
(
1
)
O(1)
O(1) 解法。我们假设
a
1
a_1
a1 为第
1
1
1 天的桃子数,则
a
n
=
1
a_n = 1
an=1 ,
a
i
=
2
(
a
i
+
1
+
1
)
(
1
≤
i
<
n
)
a_i = 2(a_{i+1} + 1)\ (1 \le i < n)
ai=2(ai+1+1) (1≤i<n) ,则有
a
i
+
2
=
2
(
a
i
+
1
+
1
)
+
2
=
2
(
a
i
+
1
+
2
)
a_i+ 2 = 2(a_{i+1} + 1) + 2 = 2 (a_{i+1} + 2)
ai+2=2(ai+1+1)+2=2(ai+1+2) ,即
a
i
+
2
a_i + 2
ai+2 是等比数列,公比为
2
2
2 ,于是有:
a
i
+
2
=
3
×
2
n
−
i
a_i + 2 = 3\times 2^{n - i}
ai+2=3×2n−i
即 a 1 = 3 × 2 n − 1 − 2 a_1 =3\times 2^{n - 1} - 2 a1=3×2n−1−2 。
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
scanf("%d", &n);
printf("%d", 3 * (1 << (n - 1)) - 2);
return 0;
}