题目大意:给一个1~n的一种排列,每次随机选一个数,如果下一个数比他小,则交换,一直进行上述过程直到下一个数比他大。最少经过多少次这样的循环能将其变成升序?
大致思路:
想要这样的循环次数最少必定是 每次选最大的不符合位置的数,将其交换至正确的位置。
从后面扫一遍数组,如果当前的位置的数不符合其位置,则循环次数+1,标记当前的数,假设其已移动到正确的位置
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <string.h>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <list>
#include <bitset>
#include <stack>
#include <stdlib.h>
#define lowbit(x) (x&-x)
//ios::sync_with_stdio(false);
typedef long long ll;
typedef long long LL;
using namespace std;
int a[1000005];
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
int cas = 1;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int x = 1000000+10;
int ans = 0;
for(int i=n-1;i>=0;i--)
{
if(a[i]<x) x = a[i];
else ans++;
}
cout<<"Case #"<<cas++<<": "<<ans<<endl;
}
return 0;
}