P1011 [NOIP1998 提高组] 车站 题解

题目描述

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

输入格式

输入只有一行四个整数,分别表示始发站上车人数 a,车站数 n,终点站下车人数 m 和所求的站点编号 x。

输出格式

输出一行一个整数表示答案:从 x站开出时车上的人数。

输入输出样例

输入 #1

5 7 32 4

输出 #1

13

说明/提示

对于全部的测试点,保证 1 ≤a≤20,1 ≤x≤n≤20,1≤m≤2×10^{4}

本次考察的知识点是斐波那契数列,根据题意,列出多个站的上下车人数以及车上人数能清晰地找到信息的关系

车站上车人数下车人数人数增加量✳到站时人数✳
第一站 a0aa
第二站tt0a
第三站a+ta2a
第四站a+2ta+tt2a+t
第五站2a+3ta+2ta+t3a+2t
第六站3a+5t2a+3ta+2t4a+4t
第七站5a+8t3a+5t2a+3t6a+7t
第八站8a+13t5a+8t3a+5t9a+12t

通过观察表格中加星号的两列不难看出考察斐波那契数列的意图

处理本题主要依靠找出a的系数的变化规律以及t的系数的变化规律

此题目找到规律之后十分简单

代码如下

#include<stdio.h>
int xishu(int a,int n,int m,int x)
{
    int aa[25],tt[25],ff[25],t,i,s;
    ff[0] = 0;
    ff[1] = 1;
    ff[2] = 1;
    for(i=3;i<=24;i++){
        ff[i] = ff[i-1]+ff[i-2];//斐波那契数列
        //printf("%d ",ff[i]);
    }
    aa[0] = 0;
    aa[1] = 1;
    aa[2] = 1;
    aa[3] = 2;
    for(i=4;i<=24;i++){
        aa[i] = aa[i-1]+ff[i-4];//a前的系数
    }
    tt[0] = 0;
    tt[1] = 0;
    tt[2] = 0;
    tt[3] = 0;
    for(i=4;i<=24;i++){
        tt[i]=tt[i-1]+ff[i-3];//t前的系数
        //printf("%d",tt[i]);
    }
    t=(m-aa[n-1]*a)/tt[n-1];
    printf("%d",(a*aa[x]+t*tt[x]));
//巧妙运用系数来求未知数
}
int main()
{
    int a,n,m,x;
    scanf("%d",&a);
    scanf("%d",&n);
    scanf("%d",&m);
    scanf("%d",&x);
    xishu(a,n,m,x);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值