• (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);
    	}
    	
    
    }
    
    
  • 相关阅读:
    重载操作符- 友元函数- 非/模板类重载
    静态成员变量
    函数指针的使用
    高斯消元_HihoCoderOffer6_03
    多重背包(MultPack = ZeroOnePack + CompletePack)
    高斯消元
    textbox文本键盘全选
    BASE64-客户端(js)加码-服务器端(c#)解码,URL传递“汉字参数”解决方法
    Jquery获取input=text 的值
    sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13079082.html
Copyright © 2020-2023  润新知