zcmu1517:ソートの問題

タイトルリンク:https//acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1517

トピック

長さnの配列の場合、毎回番号aiを選択すると、aiは現在の位置から位置を入れ替えます。右側の数値が彼よりも小さい場合は、位置を入れ替えます。それ以外の場合は、移動を停止します。

最終的なシーケンスを昇順にするために、少なくともいくつかのポイントを移動するように依頼します。

アイデア

最初の判断基準は、後ろに彼よりも小さい数字があるかどうかであり、各数字は後ろにしか移動できないかどうかです。その後、彼よりも小さい数字は左に走らず、変化しません。

次に、選択した数値に共通する点が1つあります。つまり、後で小さい数値があるかどうかにかかわらず、xの最小値をnに前処理してから、現在の値をそれと比較できます。

ACコード

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 5;
int a[maxn], b[maxn];
int main(){
    int t; cin >> t;
    while(t --){
        int n; cin >> n;
        for(int i = 1; i <= n; i ++) cin >> a[i];
        b[n + 1] = 0x3f3f3f3f;
        for(int i = n; i >= 1; i --) b[i] = min(b[i + 1], a[i]);
        int ans = 0;
        for(int i = 1; i <= n; i ++){
            if(a[i] > b[i]) ans ++;
        }
        cout << ans << endl;
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_43911947/article/details/112354189