标签: 全排列杂谈 |
分类:STL |
这个函数可以计算一组数据的全排列
假设数列 d1,d2,d3,d4……
范围由[first,last)标记,调用next_permutation使数列逐次增大,这个递增过程按照字典序。
若当前调用排列到达最大字典序,比如dcba,就返回false,同时重新设置该排列为最小字典序。
返回为true表示生成下一排列成功。
另外,库中另一函数prev_permutation与next_permutation相反,由原排列得到字典序中上一次最近排列。
**********************************************************************************************
几道题目:
1.HDU 1027
求第M个排列,写错一次,数组开头num+1没+1
代码:
#include
#include
using namespace std;
int main()
{
int n,m,i;
int num[1001];
for(i=1;i<=1000;i++)
num[i]=i;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i
for(i=1;i<=n;i++)
{
if(i>1) printf(" ");
printf("%d",num[i]);
}
printf("/n");
sort(num+1,num+n+1);
}
return 0;
}
**********************************************************************************************
2.PKU 3187
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 1653 | Accepted: 950 |
Description
3 1 2 4Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities.
4 3 6
7 9
16
看这题目的风格似乎是USACO上的题?还没做到,预先过了一题,嘿嘿
生成N的全排列,然后一次计算s[0],与sum相等即为答案!
调试一次,把s[]和m的初始化放到了while(1)的外面,变成死循环
代码:
#include
#include
#include
using namespace std;
int main()
{
int n,sum,i,j,m;
int num[11],s[11];
for(i=0;i<10;i++)
num[i]=i+1;
while(scanf("%d%d",&n,&sum)!=EOF)
{
while(1)
{
for(i=0;i
m=n-1;
while(m!=0)
{
for(j=0;j
m--;
}
if(s[0]==sum)
break;
next_permutation(num,num+n);
}
for(i=0;i
if(i>0) printf(" ");
printf("%d",num[i]);
}
printf("/n");
}
return 0;
}
**********************************************************************************************
PKU 1146
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2657 | Accepted: 1645 |
简单应用
代码:
#include
#include
using namespace std;
int main()
{
int len;
char s[51];
while(scanf("%s",s)!=EOF)
{
if(s[0]=='#')
break;
len=strlen(s);
if(next_permutation(s,s+len))
printf("%s/n",s);
else
printf("No Successor/n");
}
return 0;
}
**********************************************************************************************
PKU 1731
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4751 | Accepted: 3060 |
输出全排列,一开始打算用prev_permutation回到字典序最小的那个,发现循环停止不了
是不是prev_permutation的返回值跟next的不同呢?解决后再补上
于是改用sort排序,也是一题简单应用
代码:
#include
#include
#include
using namespace std;
bool cmp(char x,char y)
{
return x
int main()
{
int len;
char s[201];
while(scanf("%s",s)!=EOF)
{
len=strlen(s);
sort(s,s+len,cmp);
printf("%s/n",s);
while(next_permutation(s,s+len))
printf("%s/n",s);
}
return 0;
}
转载自:http://blog.sina.com.cn/s/blog_62a14e150100fti9.html