车站(P1011)【洛谷】{Java}

目录

题目描述

输入格式

输出格式

输入输出样例

说明

思路

代码


题目描述

火车从始发站(称为第 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]);
	}

}

洛谷是一个在线的编程竞赛和练习平台,而P1217是洛谷上的一个题目编号。具体来说,P1217是一个关于数字问题的题目,要求编写程序找出给定范围内的所有满足特定条件的数字。 在洛谷P1217题目中,给定了一个范围 [a, b],要求找出这个范围内满足以下条件的数字: 1. 该数字的各位数字之和等于给定的一个常数d。 2. 该数字的各位数字之积等于给定的一个常数s。 你提到的是洛谷P1217java,应该是指使用Java语言来解决这个题目。你可以使用Java编写一个程序,通过遍历范围内的每个数字,判断是否满足条件,然后输出符合条件的数字。 具体的解题思路可以参考以下步骤: 1. 定义范围 [a, b] 和给定的常数d、s。 2. 使用一个循环遍历范围内的每个数字。 3. 对于每个数字,将其转换为字符串,然后遍历字符串中的每个字符,计算各位数字之和sum和各位数字之积product。 4. 判断sum是否等于d,product是否等于s,如果满足条件则输出该数字。 下面是一个简单的Java代码示例,用于解决洛谷P1217题目: ```java public class Main { public static void main(String[] args) { int a = 100; // 范围起始值 int b = 200; // 范围结束值 int d = 5; // 给定的常数d int s = 120; // 给定的常数s for (int num = a; num <= b; num++) { String strNum = String.valueOf(num); int sum = 0; int product = 1; for (int i = 0; i < strNum.length(); i++) { int digit = Character.getNumericValue(strNum.charAt(i)); sum += digit; product *= digit; } if (sum == d && product == s) { System.out.println(num); } } } } ``` 这段代码会输出在范围 [a, b] 内满足条件的数字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零维展开智子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值