赞
踩
Description
Input
Output
Sample Input
3 3 1 2 3 1 3 1 3 2 1 10 2 1 2 3 4 5 6 7 8 9 10
Sample Output
3 1 2 1 2 3 1 2 3 4 5 6 7 9 8 10
这道题有些古怪,在提交时只能用scanf和printf,输入输出流不能用,显示runtime error,并且在做本题的时候,自己加了一步简化运算,结果一加上就显示runtime error,提交了好多遍才找出来的这个错。。。
本题思路:在给出的序列中从右往左找出第一个部位递增的数,然后找出这个数之后的大于该数的最小的数,将其交换,然后再将找出的数的后面升序
所用库函数sort
下面是自己的代码,有点复杂不过是对的(用C++提交)
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int x,d,i,j,a[1500],n,w;
scanf("%d",n);
for(w=1;w<=n;w++)
{
scanf("% d%d",x,d); //scanf("%d,%d",x,d);这样写是不对的,切记!!!!!!!!!!!
int all=1;
for(i=0;i<x;i++)
scanf("%d",a[i]);
if(x==1)
printf("%d ",a[0]);
else
{
for(i=1;i<=x;i++)
all=all*i;
d=d%all;
int mis,min;
for(i=1;i<=d;i++)
{
int jilu=1;
j=x-1;
while(a[j]<a[j-1])
{
if(j==1)
{
jilu=0;
break;
}
else
j--;
}
if(jilu==0)//这是从右到左都是递增的 //出错 if(jilu=0)
{
for(j=0;j<x;j++)
a[j]=j+1;
}
else//不是递增的
{
mis=j-1;//找出从右往左开始第一个不是递增的数的地址 // 出错mis=j-1
min=j;//记录所找出的从右往左开始第一个不是递增的数后面的最大值的地址 // 出错max=j
//j=j+1;
while(j<x)
{ if(a[j]<a[min]&&a[j]>a[mis])
min=j;
j++;
}
int t=a[min];
a[min]=a[mis];
a[mis]=t;
sort(a+mis+1,a+x);
// for(i=0;i<x;i++)
//cout<<a[i]<<' ';
}
}
for(i=0;i<x;i++)
printf("%d ",a[i]);
cout<<endl;
}
}
return 0;
}
下面是用的新的库函数,网友代码
#include <iostream>
#include<algorithm> //头文件
using namespace std;
int a[1024];
int main()
{
int n,i,t,k;//t为实验组数
cin>>t ;
while(t--)
{
cin>>n>>k;
for(i=0;i<n;i++)
cin>>a[i];
while(k--)
next_permutation(a, a + n);
for(i=0;i<n-1;i++)
cout<<a[i]<<' ';
cout<<a[n-1]<<endl;
}
return 0;
}
#include <iostream>
#include<algorithm>
using namespace std;
int a[1024];
int main()
{int n,i,t,k;
scanf ( "%d" , &t) ;
while(t--)
{
scanf ( "%d %d" , &n , &k) ;
for(i=0;i<n;i++)
scanf ( "%d" , &a[i] ) ;
while(k--)
next_permutation(a, a + n);
for(i=0;i<n-1;i++)
printf ( "%d " , a[i] ) ;
printf ( "%d\n" , a[n-1] ) ;
}return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。