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;}


原创粉丝点击