寒假过题水题——I - 不容易系列之二

本文介绍了一道有趣的算法题,通过逆向思维解决徐老汉过收费站时羊的数量变化问题。从市场剩余3只羊出发,逆向计算初始羊的数量,巧妙运用递推关系,避免了复杂的函数递归。

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

I - 不容易系列之二

由于徐老汉没钱,收费员就将他的羊拿走一半,看到老汉泪水涟涟,犹豫了一下,又还给老汉一只。巧合的是,后面每过一个收费站,都是拿走当时羊的一半,然后退还一只,等到老汉到达市场,就只剩下3只羊了。

你,当代有良知的青年,能帮忙算一下老汉最初有多少只羊吗?

  • input

输入数据第一行是一个整数N,下面由N行组成,每行包含一个整数a(0<a<=30),表示收费站的数量。

  • output

对于每个测试实例,请输出最初的羊的数量,每个测试实例的输出占一行。

  • Sample Input

2

1

2

  • Sample Output

4

6

解题思路:

递推关系很简单,就是am=(am-1 -1)*2

初始条件 am=3;求a0,倒着递推就行。

第一次尝试想用函数递归,后来发现没必要,直接用数组存储30个收费站的sheep个数就可以了。

代码:

#include

using namespace std;

/*int fun(int i) {

int a[31];

a[0] = 3;

a[i] = (fun(i - 1) - 1) * 2;

return a[i];

}*/

int main()

{

int n,m;

int a[31];

cin >> n;//实例个数

while (n--) {

    cin >> m;//收费站个数

    a[m]=3;//最后一次过收费站sheep的个数是3

    while (m > 0) {

        a[m - 1] = 2 * (a[m] - 1);//上一站sheep个数是本站-1之后的2倍(递推关系)

        m--;//最后一次循环m值为1,得到的是a[0],之后m--变成0

    }

    cout <<a[0]<< endl;//所求a[0]是最初sheep的个数

    }

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值