【题解】上车人数

[tip type="info"]北邮C++练习题6-2 1072上车人数,抄作业请直接翻最底下[/tip]

?原题复现

背景

公共汽车从始发站(称为第$1$站)开出,在始发站上车的人数为$a$,然后到达第$2$站,在第$2$站有人上、下车,但上、下车的人数相同,因此在第$2$站开出时(即在到达第$3$站之前)车上的人数保持为$a$人。
从第$3$站起(包括第$3$站)上、下车的人数有一定的规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第$n-1$站),都满足此规律。
现给出的条件是:共有$n$个车站,始发站上车的人数为$a$,最后一站下车的人数是$m$(全部下车)。
试问从$x$站开出时车上的人数是多少?

输入格式

只有一行,四个整数$a,n,m和x$

输出格式

$x$站开出时车上的人数

输入样例

在这里给出一组输入。例如:

5 7 32 4

输出样例

在这里给出相应的输出。例如:

13

限制

代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB


?分析

审题

由题目,设上车人数$Up_i$,下车人数$Down_i$,$A_i(i=1,2,...,n)$,有
$$A_i=Up_i-Down_i+A_{i-1}=(Up_{i-1}+Up_{i-2})-Up_{i-1}+A_{i-1}=A_{i-1}+Up_{i-2}$$
我们敏锐地捕捉到$i=(i-1)+(i-2)$这种形式的数字,联想到了大名鼎鼎的 斐波那契数列
最后搬出代码,斐波那契数列的实现形式一般和 递推递归 有关。

?代码实现

暴力枚举

//暴力枚举
#include <iostream>
using namespace std;
inline int add(int a,int u,int x)
{
    switch(x){
        case 1:
            return a;
        case 2:
            return 0;
        case 3:
            return a;
        case 4:
            return u;
        default:
            return add(a,u,x-1)+add(a,u,x-2);
    }
}
int main()
{
    register int a,n,m,x,sum=0,u;
    cin>>a>>n>>m>>x;
    for(u=1;;u++){
        sum=0;
        for(int i=1;i<n;i++)
        {
            sum+=add(a,u,i);
        }
        if(sum==m)
            break;
    }
    sum=0;
    for(int i=1;i<=x;i++)
    {
        sum+=add(a,u,i);
    }
    cout<<sum;
    return 0;
}
评论区
头像
文章目录