(Java实现) 车站

题目描述

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

输入

每个测试文件只包含一组测试数据,每组输入四个整数a、n、m和x。

输出

对于每组输入数据,输出从x站开出时车上的人数。

分析:

手动推一下规律可以得到下表:

在这里插入图片描述

上图中的b是设第二站上车b人,下车b人。

可以发现从第4项开始,净增加人数中的a的系数其实是Fibonacci数列,b的系数也是类似Fibonacci数列一直累加,用两个数组f1和f2分别记录两个系数,而当前总人数其实就是净增加人数的累加,求得总人数,就可以得到未知数b,然后再根据第x站a,b的系数,即可求得x站的人数。

import java.util.Scanner;


public class shangxiachewenti {
	public static int count = 0,a = 0;
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		 a = sc.nextInt();//开车时的人数
		int n = sc.nextInt();//一共经过的站数
		int m=sc.nextInt();//最后一站的下车人数
		int x =sc.nextInt();//开出x站时车上的人数
		int b = 0;
		int [] f1 = new int [n];
		int [] f2 = new int [n-1];
		f1[0]=1;  f2[0]=0;
		f1[1]=0;  f2[1]=0;
		f1[2]=1;  f2[2]=0;
		f1[3]=0;  f2[3]=1;
		int sum1=2;
		int sum2=1;
		for (int i = 4; i < f2.length; i++) {
			f1[i]=f1[i-1]+f1[i-2];
			sum1+=f1[i];
			f2[i]=f2[i-1]+f2[i-2];
			sum2+=f2[i];
		}
		for (int i = 1; i <100; i++) {
			if(m==sum1*a+sum2*i){
				b=i;
				break;
			}
		}
		int count1 = 0;
		int count2 = 0;
		for (int i = 0; i < x; i++) {
			count1+=f1[i];
			count2+=f2[i];
		}
		int sum = count1 * a+count2*b;
		System.out.println(sum);
	}
	

}

posted @ 2019-06-02 08:34  南墙1  阅读(31)  评论(0编辑  收藏  举报