洛谷P1011车站题解--zhengjun

题目描述

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

输入格式

a a a(≤20), n n n(≤20), m m m(≤2000),和 x x x(≤20),

输出格式

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

输入输出样例
输入 #1 复制
5 7 32 4
输出 #1 复制
13

思路

直接先列个表来找找规律。

数据1234567
上车人数aba+ba+2b2a+3b3a+5b5a+8b
下车人数0bba+ba+2b2a+3b3a+5b
开始时车内人数aa2a2a+b3a+2b4a+4b6a+7b
这样可能还是找不到规律。我们把a,b换掉,用它们的系数表示。
数据1234567
:–
上车人数111+11+22+33+55+8
下车人数0111+11+22+33+5
开始时车内人数1122+13+24+46+7
这还不够明显吗。
数据1234567
:–
上车人数11235813
下车人数0112358
开始时车内人数11235813
斐波那契数列!!

那么,我们用 f f f数组来计算斐波那契数列。

f [ 1 ] = 1 ; f [ 2 ] = 1 ; f [ 3 ] = 2 ; f [ 4 ] = 3 ; f [ 5 ] = 5 ; f [ 6 ] = 8... f[1]=1;f[2]=1;f[3]=2;f[4]=3;f[5]=5;f[6]=8... f[1]=1;f[2]=1;f[3]=2;f[4]=3;f[5]=5;f[6]=8...

看表可知:

  1. i i i 站的上车人数 = f [ i − 2 ] × a + f [ i − 1 ] × b =f[i-2]\times a+f[i-1]\times b =f[i2]×a+f[i1]×b i ≥ 2 i\ge 2 i2 )
  2. i i i 站的下车人数 = f [ i − 3 ] × a + f [ i − 2 ] × b =f[i-3]\times a+f[i-2]\times b =f[i3]×a+f[i2]×b i ≥ 3 i\ge 3 i3 )
  3. i i i 站的开始时车内人数

= = = ∑ k = 1 i \sum_{k=1}^{i} k=1i(第 k k k站上车人数 − - k k k站下车人数)(可以抵消)

= = = i i i站上车人数 + a − b +a-b +ab

= f [ i − 2 ] × a + f [ i − 1 ] × b + a − b =f[i-2]\times a+f[i-1]\times b+a-b =f[i2]×a+f[i1]×b+ab

= ( f [ i − 2 ] + 1 ) × a + ( f [ i − 1 ] − 1 ) × b =(f[i-2]+1)\times a+(f[i-1]-1)\times b =(f[i2]+1)×a+(f[i1]1)×b i ≥ 2 i\geq 2 i2 )

所以,我们只要一步一步推下来,推到 n n n,再根据 m m m a a a算出 b b b,再求出第 x x x站开始时的人数就可以了。
注意:题中的 m m m应该是第 n n n站开始时的人数

以下是样例:

数据1234567
上车人数5b5+b5+2b10+3b15+5b0
下车人数0bb5+b5+2b10+3b32
开始时车内人数551010+b15+2b20+4b32

也就是 第六站开始时的人数 = m =m =m

( f [ i − 2 ] + 1 ) × a + ( f [ i − 1 ] − 1 ) × b = m (f[i-2]+1)\times a+(f[i-1]-1)\times b=m (f[i2]+1)×a+(f[i1]1)×b=m

所以 b = m − ( f [ i − 2 ] + 1 ) × a f [ i − 1 ] − 1 = 32 − ( 3 + 1 ) × 5 5 − 1 = 3 b=\frac {m-(f[i-2]+1)\times a } { f[i-1]-1 }=\frac {32-(3+1)\times 5}{5-1}=3 b=f[i1]1m(f[i2]+1)×a=5132(3+1)×5=3

那么 第 4 4 4站开始时的人数

= = = i i i站上车人数 + a − b +a-b +ab

= ( f [ i − 2 ] + 1 ) × a + ( f [ i − 1 ] − 1 ) × b =(f[i-2]+1)\times a+(f[i-1]-1)\times b =(f[i2]+1)×a+(f[i1]1)×b

= ( f [ 2 ] + 1 ) × a + ( f [ 3 ] − 1 ) × b =(f[2]+1)\times a+(f[3]-1)\times b =(f[2]+1)×a+(f[3]1)×b

= ( 1 + 1 ) × 5 + ( 2 − 1 ) × 3 =(1+1)\times 5+(2-1)\times 3 =(1+1)×5+(21)×3

= 13 =13 =13

不就了事了吗

我感觉讲的够详细了。

最后,特判一下 x = 1 x=1 x=1 时的情况,直接输出 a a a

代码

#include<bits/stdc++.h>
int f[25]={0,1,1};
int n,m,a,b,x;
int main(){    
	scanf("%d%d%d%d",&a,&n,&m,&x);
    for(int i=3;i<=n;i++)
	    f[i]=f[i-1]+f[i-2];
    b=(m-f[n-1-2]*a-a)/(f[n-1-1]-1);//是第(n-1)个点的开始为m,套用公式
    if(x==1)//特判
	    printf("%d",a);
    else
	    printf("%d",(f[x-2]+1)*a+(f[x-1]-1)*b);//套公式
    return 0;
}

谢谢–zhengjun

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

A_zjzj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值