1. 程式人生 > 其它 >某谷P1011 [NOIP 1998提高組] 車站

某谷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;
}