本文主要是介绍给定一些数将这些数组合成一个新的数,并对它们由小到大排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;
}
这篇关于给定一些数将这些数组合成一个新的数,并对它们由小到大排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!