| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
模拟AC,非STL摘自:http://wenku.baidu.com/link?url=1xb84cvmj8woQVMuOyD2xsxMVMz36r3UYV1X7OkZ8H9TsH2qYf4GBeA4XZJeZbNp9TgZ90MtLPHZPFjFG8oxQJZHHN2hLKIQkeU8jMey38i
//解题思路
//假定给定排列中的n个数从左到右是A1,A2,A3…An。
//从An开始,往左边找,直到找到某个Aj,满足Aj-1 < Aj
//在Aj,Aj+1,…An中找到最小的比Aj-1大的数,将这个数和
//Aj-1互换位置
//将从位置j到位置n的所有数(共n-j+1个)从小到大重新排序
//排好序后,新的排列就是所要求的排列
//当然,按照题目要求,如果A1,A2,A3…An已经是降序
//那么,它的下一个排序就是An,An-1,An-2…A1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2000;
int a[maxn];
int cmp( const void *a , const void *b )
{
return *(int *)a - *(int *)b; //升序排序
//return *(int *)b - *(int *)a; //降序排序
}
int main()
{
//freopen("pailie.in","r",stdin);
//freopen("pailie.out","w",stdout);
int m;
cin >> m;
while(m--)
{
int n, k;
cin >> n >> k;
//排列存放在a[1]~a[n]
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
a[0] = 10000; //确保a[0]比排列中所有的数都大
while(k--)
{
int j;
for(j = n; j >= 1 && a[j-1] > a[j]; j--);
if(j >= 1)
{
int nMinLarger = a[j];
int nMinIdx = j;
//下面找出从a[j]及其后最小的比a[j-1]大的元素中的“最小值”
for(int kk = j; kk <= n; kk++)
{
if(a[kk] < nMinLarger && a[kk] > a[j-1])
{
nMinLarger = a[kk];
nMinIdx = kk;
}
}
//交换位置
a[nMinIdx] = a[j-1];
a[j-1] = nMinLarger;
//对a[j]~a[n]升序排列
qsort(a+j, n-j+1, sizeof(int), cmp);
}
else //a里面的排列已经是降序了,那么下一个排列是1 2 3 …n
{
for(int i = 1; i <= n; i++)
a[i] = i;
}
}
for(int i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator