题目链接: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;
}