题目链接:http://poj.org/problem?id=1833
next_permutation函数相关:
使用next_permutation(p, p + n)函数需要包含<algorithm>头文件;
next_permutation(p, p + n)的两个参数分别代表当前序列的起始地址和结束地址;
它的功能是求当前序列p按照字典序排列的下一个序列;
例如p={1, 2, 3},
则p按照字典序排列的全排列为
1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1;
若执行next_permutation(p, p + n);
则p会被转换成{1,3,2};
函数执行的过程如下:
从最后一个元素开始,比较相邻元素的大小,当找到左边元素i<右边元素j时,标记i,表示i待交换;
重新从最后一个元素开始查找,直到找到元素k>i,交换i与k的位置,则得到新的排列;
白书包括网上有许多资料表示next_permutation函数有边界判定,
即当函数判定当前序列已经转换成字典序降序后(如起初为{1,2,3},通过不断调用该函数转换至{3,2,1})
函数会返回false,且没有排列生成;
但是在实际编译环境(编译器:TDM-GCC 4.7.1 64-bit,IDE:Dev-C++ 5.4.1)中,
运行以下代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
char p1[] = "4321";
int p2[] = {4, 3, 2, 1};
int main()
{
next_permutation(p1, p1 + 4);
next_permutation(p2, p2 + 4);
puts(p1);
for(int i = 0; i < 4; i++)
printf("%d", p2[i]);
return 0;
}
不论是字符型还是整型均输出{1,2,3,4},又回到了初始的升序状态,
所以有关边界控制这一点有待讨论。
题意已经讲的十分明确,不再赘述;
代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int m, n, k, p[1100];
scanf("%d", &m);
for(int i = 0; i < m; i++)
{
scanf("%d%d", &n, &k);
for(int j = 0; j < n; j++)
scanf("%d", &p[j]);
for(int j = 0; j < k; j++)
next_permutation(p, p + n);
for(int j = 0; j < n; j++)
printf("%d ", p[j]);
printf("\n");
}
return 0;
}
还有一点疑问就是为何同一份代码提交G++超时,而提交C++通过,
起初我是看到刘杰大神在出现以上情况,就果断交了C++,水过
至于为何,昨晚听LSS说是多次调用printf导致的,网上有相应的解释‘;
倘若你患上强迫症硬是要用G++提交,使用copy函数可破
详情请见链接http://www.cnblogs.com/coolwind-sea/archive/2012/04/17/2454313.html