火车过站

问题描述
  火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
输入格式
  输入包含一行, 有四个正整数:a(a<=100),n(n<=20),m(m<=10000)和x(x<=19)
输出格式
  输出为一个整数,为x站开出时车上的人数。
/*
 * 第几站   上车        下车         车上人数
 * 1          a1          0             a1
 * 2          a2          a2            a1
 * 3         a1+a2        a2            a1+a1
 * 4         a1+a2+a2     a1+a2         a1+a1+a2
 * 5    a1+a2+a1+a2+a2    a1+a2+a2      a1+a1+a2+a1+a2 
 * .           .            .               .
 * .           .            .               .
 * .           .            .               .
 * 到最后一站的人数就是m ,全部下完
 * 思路,只要统计出a1个数和a2的个数就能求出a2,其中a1已经给出,m的数量就是n-1车站的开车的人数
 * a2=(m-a1*a1的个数)/a2的个数
 * 
 * */
import java.util.*;

public class Main3 {
	public static int a, n, m, x;
	// 上车的人数
	public static int[][] arrays;
	// 车上人数
	public static int[][] sum;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		a = sc.nextInt();
		n = sc.nextInt();
		m = sc.nextInt();
		x = sc.nextInt();
		arrays = new int[20][2];
		sum = new int[20][2];
		// 上车人数
		arrays[0][0] = 1;
		arrays[0][1] = 0;
		arrays[1][0] = 0;
		arrays[1][1] = 1;

		for (int i = 2; i < n - 1; i++) {
			arrays[i][0] = arrays[i - 1][0] + arrays[i - 2][0];
			arrays[i][1] = arrays[i - 1][1] + arrays[i - 2][1];
		}

		// 车上人数
		sum[0][0] = 1;
		sum[0][1] = 0;
		sum[1][0] = 1;
		sum[1][1] = 0;
		for (int i = 2; i < n - 1; i++) {
			sum[i][0] = sum[i - 1][0] + arrays[i - 2][0];
			sum[i][1] = sum[i - 1][1] + arrays[i - 2][1];
		}
		// System.out.println(sum[n - 2][0] + " " + sum[n - 2][1]);
		// 求a2
		int a2 = (m - sum[n - 2][0] * a);
		if (a2 != 0) {
			a2 = a2 / sum[n - 2][1];
		}
		// 求第x站的人数
		System.out.println(sum[x - 1][0] * a + sum[x - 1][1] * a2);
	}
}

阅读更多
个人分类: 练习 java 算法练习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭