[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;
}
网站名称: 短巷与雨
网站地址: https://www.hudi.space
头像地址: https://www.hudi.space/img/avator.jpg
RSS地址: https://www.hudi.space/rss.xml
网站描述: 为学日益,为道日损。