K
来源:互联网 发布:普联软件深圳分公司 编辑:程序博客网 时间:2024/06/09 18:29
K - K.Bro Sorting
HDU - 5122题目大意:给一个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;}