某谷P1011 [NOIP 1998提高組] 車站
阿新 • • 發佈:2021-07-15
不得不說,我太遜了!
式子竟然推了半天,我都服了我自己了。。。
廢話不多說,先講講思路
題目連結: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; }