제목 링크 : 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;
}