歡迎加入我的 Discord 群組與我討論程式相關的問題!

Posted on 

 by 

 in ,

CSES – Collecting Numbers

評分:1 分,滿分為 5。

題目連結

題意

給一個 n 跟 1 ~ n 的 permutation。每次你可以從左往右拿數字,但是你拿到數字必須要是遞增的。問最少可以花幾次就拿完全部的數字。

解題方法

由於是從左往右拿,x-1 一定要在 x 右邊才能在一趟被一起照順序拿。
所以,我們可以用 a[i] 的 index 來判斷需要多少趟才能拿完。
如果 idx[x] < idx[x-1],代表 x 在 x-1 左邊,一定要分兩趟才能拿完,否則可以在一趟就一起拿。

#include <bits/stdc++.h>
using namespace std;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    vector <int> a(n+1), idx(n+1);
    for(int i = 1;i <= n;i++){
        cin >> a[i];
	idx[a[i]] = i;
    }
    int cnt = 1;
    for(int i = 1;i <= n;i++){
	if(idx[i] <= idx[i-1])
	   cnt++;
    }
    cout << cnt << '\n';
}

發表迴響

Blog at WordPress.com.

%d 位部落客按了讚: