题目链接
题目大意
- 根据题目给出的每个车站上下车人数的规律,以及测试点输入的数据:始发站上车人数a、车站数n、终点站下车人数m,编写程序,计算出所求的站点编号x火车发车时车上的人数
解题思路
- 假设第二站上下车人数为x,推导每个车站火车发车时车上人数的公式表达式:
- 推导出公式为:m = k1a + k2x
- 其中k1 k2为a和x前的系数,a为始发站上车人数,x为第二站的上下车人数,m为终点站下车人数
- k1_i = k1_(i-1) + k1_(i-2) - 1 从第四站开始为前两站系数之和 - 1
- k2_i = k2_(i-1) + k2_(i-2) + 1 从第四站开始为前两站系数之和 + 1
- 先根据a和x前的系数k1 k2的规律,求出最后一站前一站发车时车上人数表示公式的k1 k2,最后一站下车人数等于前一站上下车后车上人数(最后一站全部下)
- 在求解最后一站前一站发车时车上人数表示公式的k1 k2的过程中,保存每一站发车时车上人数表示公式的k1 k2
- 然后根据推导出公式求出未知数x
- 最后利用推导公式和提前求解保存的每一站发车时车上人数表示公式的k1 k2,求解输出所求站点xi出发时的车上人数
截图代码
import java.io.*;
public class Main {
private static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
private static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static void main(String[] args) {
int a = readInt();
int n = readInt();
int m = readInt();
int xi = readInt();
int[] k1 = new int[n];
int[] k2 = new int[n];
for (int i = 1; i <= n - 1; i++) {
if (i == 1) {
k1[i] = 1;
k2[i] = 0;
} else if (i == 2) {
k1[i] = 1;
k2[i] = 0;
} else if (i == 3) {
k1[i] = 2;
k2[i] = 0;
} else {
k1[i] = k1[i - 1] + k1[i - 2] - 1;
k2[i] = k2[i - 1] + k2[i - 2] + 1;
}
}
int x = (m - k1[n - 1] * a) / k2[n - 1];
out.print(k1[xi] * a + k2[xi] * x);
out.flush();
}
private static int readInt() {
int in = 0;
try {
st.nextToken();
in = (int) st.nval;
} catch (IOException e) {
e.printStackTrace();
}
return in;
}
}