某谷P1011 [NOIP 1998提高组] 车站
不得不说,我太逊了!
式子竟然推了半天,我都服了我自己了。。。
废话不多说,先讲讲思路
题目链接:https://www.luogu.com.cn/problem/P1011
这道题最开始看的时候有点懵,不过要慢慢理思路,总的来说就是这么一个图:

然后告诉你上下车人数的规律,求从x好点离开时的人数时多少
其实这道题纯粹就是找规律,也挺好找的。
首先我们设从i号点出发时的人数为sum[i],到达i号点后上车的人数为sh[i],下车的人数为xia[i],,通过枚举、画图,我们可以得到以下这个图:

其中k是指第2次下车的人数(或第二次上车的人数)
然后我们将这张图中的a和k拆分开看,用结构体存储,就可以得到以下规律:
sh[i].sha = sh[i - 1].sha + sh[i - 2].sha;
sh[i].shk = sh[i - 1].shk + sh[i - 2].shk;
xia[i].xiaa = sh[i - 1].sha;
xia[i].xiak = sh[i - 1].xiak;
sum[i].suma = sum[i - 1].suma + sh[i].sha - xia[i].xiaa;
sum[i].sumk = sum[i - 1].sumk + sh[i].shk - xia[i].xiak;
附:结构体sum存的是每一站开出时的人数,sh存的是每一站上车的人数,xia存的是每一站下车的人数
因为求的是x站开出时车上的人数,所以我们先算出第二站上车(或下车)的人数k,再直接输出sum[x].suma * a + sum[x].sumk * k就好了
附完整代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 25;
struct SUM {
int sumk,suma;
} sum[maxn];
struct shang {
int shk,sha;
} sh[maxn];
struct xia {
int xiak,xiaa;
} xia[maxn];
int main() {
int a,n,m,x;
cin >> a >> n >> m >> x;
sum[1].sumk = sum[2].sumk = 0;
sum[1].suma = sum[2].suma = 1;
sh[1].shk = 0,sh[2].shk = 1;
sh[1].sha = 1,sh[2].sha = 0;
xia[1].xiak = 0,xia[2].xiak = 1;
xia[1].xiaa = xia[2].xiaa = 0;
for(int i = 3;i <= n - 1;i ++) {
sh[i].sha = sh[i - 1].sha + sh[i - 2].sha;
sh[i].shk = sh[i - 1].shk + sh[i - 2].shk;
xia[i].xiaa = sh[i - 1].sha;
xia[i].xiak = sh[i - 1].shk;
sum[i].suma = sum[i - 1].suma + sh[i].sha - xia[i].xiaa;
sum[i].sumk = sum[i - 1].sumk + sh[i].shk - xia[i].xiak;
}
int sum_A = a * sum[n - 1].suma,sum_K = sum[n - 1].sumk;
int k = m;
k -= sum_A;
k /= sum_K;
cout << sum[x].suma * a + sum[x].sumk * k << endl;
return 0;
}

浙公网安备 33010602011771号