洛谷 P5743 【深基7.习8】猴子吃桃【递推/递归/数学】

这篇博客探讨了一道关于小猴吃桃的数学问题,通过递推和递归两种方法解决。第一天小猴吃掉桃子的一半再加一个,直到第n天剩下11个桃子。博客提供了C++代码实现,并通过数学解析给出了O(1)的时间复杂度解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n ( n ≤ 20 ) n(n\le20) n(n20) 天早上起来一看,只剩下 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) (1i<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×2ni

a 1 = 3 × 2 n − 1 − 2 a_1 =3\times 2^{n - 1} - 2 a1=3×2n12

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
	scanf("%d", &n);
	printf("%d", 3 * (1 << (n - 1)) - 2);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

memcpy0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值