| 火车上的人数 | ||||||
| ||||||
| Description | ||||||
|
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。 从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。 现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。 试问x站开出时车上的人数是多少? | ||||||
| Input | ||||||
|
有多组测试数据。 每组测试数据仅包含一行,每行包括四个整数,a,n,m和x。 0<= a <= 10 3<= n <= 30 1 <= x < n 0 <= m <= 2^31-1 | ||||||
| Output | ||||||
| 对于每组测试数据,输出一行,包括一个整数,即从x站开出时车上的人数。 | ||||||
| Sample Input | ||||||
| 5 7 32 4 | ||||||
| Sample Output | ||||||
| 13 |
我们模拟手算,发现上车的人数和下车的人数都成一种f【0】,f【1】数据不一定的斐波那契数列,枚举出几个样例就不难发现。问题所在就是数学问题,求出第二次上车的人数是关键,因为数据比较小,所以我们这里采用枚举它的模式来做题,
因为数据比较小,可以用暴力枚举的方法,其实这种题应该是放大数据,然后用矩阵快速幂啥的求斐波那契数,相对提升难度~
#include<stdio.h>
#include<string.h>
int main()
{
int a,n,m,x,i,y;
int on[31],off[31],ans[31];
while(~scanf("%d%d%d%d",&a,&n,&m,&x))
{
y=1;
memset(ans,0,sizeof(ans));
on[1]=a;ans[1]=a;off[1]=0;
while(ans[n-1]<=m)
{
on[2]=y;off[2]=y;ans[2]=a;
for(i=3;i<n;i++)
{
on[i]=on[i-1]+on[i-2];
off[i]=on[i-1];
ans[i]=ans[i-1]+on[i-2];
}
if(ans[n-1]==m)
{printf("%d\n",ans[x]);break;}
y++;
}
}
}

本文介绍了一道关于火车上人数变化的编程题目,通过斐波那契数列的方式模拟火车在各站点上下车人数的变化规律,最终求解特定站点的车上人数。

4025

被折叠的 条评论
为什么被折叠?



