zcmu1517: A Sorting Problem

题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1517

题目大意

一个长度为n的数组,每次可以选择一个数ai,然后ai就会从当前位置往后交换位置,如果右边的数比他小,那么就交换位置,否则停止移动。

问最少要选几个点移动才能使得最后的序列升序。

思路

首先评判标准是后面有没有比他小的数,然后每个数都只能往后移动或者不移动,那么比他小的数不会跑到他左边就不会变。

那么选的数都有一个共同点,就是后面有没有比他小的数了,可以预处理出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
今日推荐