[Solution] nloj.0107-題解

題解

$d$ 表示第 $d$ 天

我們注意兩種情況,當
- $d = 1$ 時,因為沒有更早的交易價格,也就是絕對買不到更早的股票,所以 $t_1$ 必為 $-1$
- $d \ne 1$時 $\dots$

我們可以很清楚的知道,我們要找的 $t_i$,其實就是對於第 $i$ 天,
在第 $[1 ,\ i-1]$ 天中,找到最大的 $k$ 使得 $k \lt i$ 時,$p_k \le p_i$
這個 $k$ 就是我們要找的 $t_i$

程式碼

#include <bits/stdc++.h>
using namespace std;

signed main() {
    int n;
    cin >> n;

    vector<int> p(n+1,0), ls(n+1, -1);
    for(int i = 1; i <= n; i++) {
        cin >> p[i];
    }

    stack<int> st;
    st.push(n);

    /*找上一個較小或相等的值*/
    for(int k = n-1; k >= 1; k--) {
        while(!st.empty() && p[k] <= p[st.top()]) {
            /*當 pk <= 最上面的值,也就是 pi 時,代表我們找到離 i 最近的時間 k*/
            /*紀錄上一個 pk 比自己小的時間 ti = k*/
            ls[st.top()] = k; 
            st.pop();
        }
        st.push(i);
    }

    for(int i = 1; i <= n; i++) {
        cout << ls[i] << (i==n?"\n":" ");
    }
}
View Post