题意:
给一个1~n的一种排列,每次随机选一个数,如果下一个数比他小,则交换,一直进行上述过程直到下一个数比他大。最少经过多少次这样的循环能将其变成升序?
思路:
答案等于数列逆序数字的个数
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int a[MAXN],b[MAXN];
int main(){
int T,n;
scanf("%d",&T);
for(int Case=1;Case<=T;Case++){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int ans=0;
b[n-1]=a[n-1];
for(int i=n-2;i>=0;i--){
b[i]=min(a[i],b[i+1]);
}
for(int i=0;i<n-1;i++){
if(a[i]>b[i+1]) ans++;
}
printf("Case #%d: %d\n",Case,ans);
}
}