POJ 1833 排列

题目链接: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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值