专栏文章

P1011 [NOIP 1998 提高组] 车站 题解

P1011题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minqdf2y
此快照首次捕获于
2025/12/02 06:38
3 个月前
此快照最后确认于
2025/12/02 06:38
3 个月前
查看原文

P1011 [NOIP 1998 提高组] 车站 题解

...其实可以打表
Code:Code:
CPP
#include <bits/stdc++.h>//由于我看不懂其他的题解 于是...模拟 
using namespace std;
int dp[25];//记录上车人数 
int main(){
	int a,n,m,x; cin >> a >> n >> m >> x;
	dp[1] = dp[2] = a;//上车人数都是前两站上车人数之和 -> 斐波那契 
	int in_last = a;//上一次的下车人数 
	int out = 0;    //当前下车人数 
	int in_now = 0; //上一次的上车人数 
	for(int i = 0;i <= 20;i++){//这一层是在枚举所有的站数 
		in_last = a,in_now = i,out = i;//保证不会被上一次情况所影响 
		dp[2] = a;
		for(int j = 3;j < n;j++){//从第3站到第n-1站 
			out = in_now;//当前下车人数=上一次上车人数 
			in_now += in_last;//更新为这一站的上车人数 
			in_last = out;//下一站的上车人数=这一站的下车人数 
			dp[j] = dp[j-1] + in_now - out;//当前车上的人数=上一站的车上人数+这一次上车人数-下车人数 
		}
		if(dp[n-1] == m) return cout << dp[x],0;//若第n-1站的车上人数=m,停止枚举 
	}
	return 0;
} 
/*
	规定t为第二站的上车人数 , dp[]为斐波那契的前几项 
	站点标号 上车人数 下车人数 车上人数 变化人数
	    1       a         0        a       a
		2       t         a        a       0
		3      a+t        t        2a      a
		4      a+2t      a+t      2a+t     t
		5     2a+3t      a+2t     3a+2t   a+t
		6     3a+5t     2a+3t     4a+4t   a+2t
		7       0       4a+4t      0     4a+4t   假设7为最后一站 
  		(...其实我们可以打表)
	我们发现:第x站的上车人数=dp[x-1]+dp[x-2]
			 第x站的车上人数=第x-1站的车上人数+dp[x]-dp[x-1]  
*/
有些绕

评论

0 条评论,欢迎与作者交流。

正在加载评论...