No.123 カードシャッフル

Quiz

https://yukicoder.me/problems/no/123

Submit

https://yukicoder.me/submissions/336529

解法1

  • そのままに実装する
    • 制約が緩いので通る

解法2

  • 操作を逆順にたどる
    • この解法で解いた
    • 解法1より速い
    • 星1.5よりは難しい

Code

int main(){
    // input
    cin >> N >> M;
    A.resize(M);
    
    FOR(i, 0, M){
        cin >> A[i];
    }
    
    ll index = 1;

    // うしろから
    for(int i=M-1; i>=0; i--){
        ll a = A[i];
        if(index==1){
            index = a;
        }
        else{
            if(a<index){
                //
            }
            else if(a>=index){
                index--;
            }
        }
    }

    p(index);
    
    return 0;
}

サンプル4

 1  2  3  4  5  6  7  8  9 10 
6番目を動かした結果
 6  1  2  3  4  5  7  8  9 10 
10番目を動かした結果
10  6  1  2  3  4  5  7  8  9 
4番目を動かした結果
 2 10  6  1  3  4  5  7  8  9 
2番目を動かした結果
10  2  6  1  3  4  5  7  8  9 
7番目を動かした結果
 5 10  2  6  1  3  4  7  8  9 
1番目を動かした結果
 5 10  2  6  1  3  4  7  8  9 
4番目を動かした結果
 6  5 10  2  1  3  4  7  8  9 
3番目を動かした結果
10  6  5  2  1  3  4  7  8  9

その他

  • サンプル4をノートに手書きで順方向にシミュレーションしたらミスして答えが合わなかったので、サンプルのシミュレーションもPCにやらせた(コードでいうsimulation()の部分)