目录
题目描述
火车从始发站(称为第 11 站)开出,在始发站上车的人数为 a,然后到达第 22 站,在第 22 站有人上、下车,但上、下车的人数相同,因此在第 22 站开出时(即在到达第 33 站之前)车上的人数保持为 a 人。从第 33 站起(包括第 33 站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第 (n-1)(n−1) 站),都满足此规律。现给出的条件是:共有 n 个车站,始发站上车的人数为 a ,最后一站下车的人数是 m(全部下车)。试问 x 站开出时车上的人数是多少?
输入格式
输入只有一行四个整数,分别表示始发站上车人数 a,车站数 n,终点站下车人数 m 和所求的站点编号 x。
输出格式
输出一行一个整数表示答案:从 x 站开出时车上的人数。
输入输出样例
5 7 32 4
13
说明
对于全部的测试点,保证1≤a≤20,1≤x≤n≤20,1≤m≤2×104。
思路
你直接看代码估计是很隐晦了,还是看下我这普通的思路吧!
题目要求第x个车站的发车人数;那就定义一个数组代表第i个车站的发车人数;我用的是dp[]数组代表,第一项和第二项都是a。可直接对其进行初始化。
我们在求第三项时可能就有点迷糊了,
第三个车站人数=
第二个车站人数+第三个车站上车人数-第三个车站下车人数=
第二个车站人数+第一个车站上车人数
……
以此类推
第x个车站人数=
第x-1个车站人数+第x-2个车站上车人数
也就是说我们只要知道每个车站上车的人数就可以把这道题解出来,是不是呢?开始。
由题意又可知一个条件,那就是最终人数-初始人数=总共增加的人数=从第一个车站上的人一直加到n-3个车站上的人。
然后我们就可以计算了,我们稍微处理一下数据就可知每个车站上车的人都是前两项之和,那么就代表着这些人数都可以用第一个车站上的人和第二个车站上的人表示,数学中叫等量代换吧。我在这里用的是sh[][]数组代表的。
算出来第二个车站上的人之后我们就可以计算任意的数据了。我在这里还稍微处理了一下,把每个车站上的人数存到一个数组里面(我用的是s[]),然后在计算dp[]即车站发车人数时就可以直接用了,不需要使用递归了。
这道题也不算很简单的题吧,有点难度的。
代码
import java.util.Scanner;
public class 车站 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a,n,m,x;
Scanner sc=new Scanner(System.in);
a=sc.nextInt();
n=sc.nextInt();
m=sc.nextInt();
x=sc.nextInt();
int[] dp=new int[n+1];
int[][] sh=new int[n+1][3];
dp[1]=a;
dp[2]=a;
sh[1][1]=1;
sh[1][2]=0;
sh[2][1]=0;
sh[2][2]=1;
for(int i=3;i<=n-3;i++) {
sh[i][1]=sh[i-2][1]+sh[i-1][1];
sh[i][2]=sh[i-2][2]+sh[i-1][2];
}
int l=0,r=0;
for(int i=1;i<=n-3;i++) {
l+=sh[i][1];
r+=sh[i][2];
}
int er=(m-a-l*a)/r;
int []s=new int[n+1];
s[1]=a;
s[2]=er;
for(int i=3;i<=n;i++) {
s[i]=s[i-1]+s[i-2];
}
for(int i=3;i<=x;i++) {
dp[i]=dp[i-1]+s[i-2];
}
System.out.println(dp[x]);
}
}