题解-[NOIP 1998 提高组] 车站

Starluo 发布于 2025-08-07 1103 字 93 次阅读


题面

原题链接在此。

题目描述

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

5 7 32 4

输出 #1

13

说明/提示

对于全部的测试点,保证 $1 \leq a \leq 20$,$1 \leq x \leq n \leq 20$,$1 \leq m \leq 2 \times 10^4$。

NOIP1998 提高组 第一题

题解

本题是一道斐波那契数列背景的模拟题,数据量不大,因此考虑模拟方法解决。

首先模拟本题样例数据的情况。由于第$ 2 $站上、下车人数未知,我们设第二站上、下车人数为$ y $人。

由题意,列出下表。

第$ n $站$1$$2$$3$$4$$5$$6$$7$
从该站开出时的人数$a$$a$$2a$$2a+y$$3a+2y$$4a+4y$$m$人全部下车
总上车数$a$$y$$a+y$$a+2y$$2a+3y$$3a+5y$$NaN$
总下车数$0$$y$$y$$a+y$$a+2y$$2a+3y$$NaN$

即:$从第(n+1)站开出时的人数=从第n站开出时的人数+总上车数-总下车数(n \in N^*)$

根据上表模拟可知,$m=4a+4y=32$,其中$a=5$,解得$y=3$。

因此,$第4站开出的人数=2a+y=2×5+3=13$。与输出样例#1吻合。

综上,我们可以用模拟的方式递推出所有$a、y$的系数,再通过解出$y$,进而得出答案。

下见代码:

#include<cstdio>
int a,n,m,x,y,tot_ax,tot_yx;
int tot_a[3],tot_y[3]; //从第n站开出时的人数(a、y的系数)
int up_a[3],up_y[3]; //总上车数(a、y的系数)
int down_a[3],down_y[3]; //总下车数(a、y的系数)
int main()
{
	scanf("%d%d%d%d",&a,&n,&m,&x);
	//初始化
	tot_ax=1;
	tot_a[0]=1,up_a[0]=1;
	tot_a[1]=1,up_y[1]=1,down_y[1]=1;
	for(int i=3;i<n;i++)
	{
		//递推
		up_a[2]=up_a[1]+up_a[0];
		up_y[2]=up_y[1]+up_y[0];
		down_a[2]=up_a[1];
		down_y[2]=up_y[1];
		tot_a[2]=tot_a[1]+up_a[2]-down_a[2];
		tot_y[2]=tot_y[1]+up_y[2]-down_y[2];
		//更新递推条件
		up_a[0]=up_a[1],up_a[1]=up_a[2];
		up_y[0]=up_y[1],up_y[1]=up_y[2];
		down_a[0]=down_a[1],down_a[1]=down_a[2];
		down_y[0]=down_y[1],down_y[1]=down_y[2];
		tot_a[0]=tot_a[1],tot_a[1]=tot_a[2];
		tot_y[0]=tot_y[1],tot_y[1]=tot_y[2];
		//存储所求的第x站人数的a、y系数
		if(i==x) tot_ax=tot_a[2],tot_yx=tot_y[2];
	}
	if(n>3) y=(m-tot_a[2]*a)/tot_y[2]; //解方程得出y的值
	printf("%d",a*tot_ax+y*tot_yx);
	return 0;
}

补充:为什么初始化时$tot\_ax=1$,解$y$值时时要加入$if(n>3)$的判断?

答:是为了特判$n=1,2$时的特殊情况。否则你会得到一个跑出WA甚至RE的80分程序。

当然,该题解的代码并不够简洁,是因为加入了一些与计算结果无关的模拟过程。

如果要改简洁一点嘛……下次一定!

此作者没有提供个人介绍。
最后更新于 2025-08-07