您的位置:首页 > 其它

给定一些数将这些数组合成一个新的数,并对它们由小到大排序

2016-03-22 23:04 363 查看
http://114.215.99.34/#/enter/problem

//1022

/*其实这道题就是要找到规律。

过程是,从右到左扫描,只要数字在不断递增(从右到左递增)就继续向左,知道找到一个不递增的元素,记录他的下标(设为p),

然后在递增区间内找到一个大于它并且最接近他的元素,交换2个的位子,然后再将p后的元素按递减排列(从右到左递减),

由于交换后还是有序的,所以只需要首尾互换即可。

至于这个为什么正确,说不清楚,慢慢体会吧*/

#include<iostream>

using namespace std;

int b[10010];

void res(int x[],int head,int tail)

{

    int i,temp;

    for(i=head;i<=(head+tail)/2;i++)

    {

        temp=x[i];

        x[i]=x[tail+head-i];

        x[tail+head-i]=temp;

    }

}

void deal(int a[],int n)

{

    int p,q,i,j;

    for(i=n-1;i>=0;i--)

    {

        if(a[i]<a[i+1] && i+1<n)

        {

            p=i;

            break;

        }

    }

    for(j=n-1;j>p;j--)

        if(a[j]>a[p])

        {

            q=j;

            break;

        }

    int temp;

    temp=a[p];

    a[p]=a[q];

    a[q]=temp;

    res(a,p+1,n-1);

}

int main()

{

    int n,m,i;

    int a[10010];

    cin>>n>>m;

    for(i=0;i<n;i++)

        cin>>a[i];

    for(i=0;i<m;i++)

        deal(a,n);

    cout<<a[0];

    for(i=1;i<n;i++)

        cout<<" "<<a[i];

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: