zcmu1517 : 정렬 문제

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