有关于全排列next_permutation函数的题

第一个题目:

Description

FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this:  

    3   1   2   4

      4   3   6

        7   9

         16
Behind 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.  

Write a program to help FJ play the game and keep up with the cows.

Input

Line 1: Two space-separated integers: N and the final sum.

Output

Line 1: An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.

Sample Input

4 16

Sample Output

3 1 2 4

题目大意:输入n、m,把1到n按一定顺序进行排列,每两个相邻数之和相加,以更少的数字产生一个新的列表(相加过程类似于杨辉三角),一直重复下去直到有一个单一的数字出现,如果这个数等于m就输出产生这个数的排列。

这个题目我做了好几次都是vs对了但是提交WA,后面看了下别人的代码,我个人觉得是我用了next_permutation函数,而数组却没有从a[0]开始,输出也没有从a[0]开始的问题


错误代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int i,j,a[11],b[11][11],n,m,s=0;
	while(cin>>n>>m)	  
	{  
		for(i=1;i<=n;i++)
			a[i]=i;
		 do{
			 for(i=1;i<=n;i++)
				 b[1][i]=a[i];
			 for(i=2;i<=n;i++)
			 {
				 for(j=1;j<=n+1-i;j++)
			             b[i][j]=b[i-1][j]+b[i-1][j+1];
			 }
			  if(b[n][1]==m)
			    {
					cout<<a[1];
					for(i=2;i<=n;i++)
						cout<<" "<<a[i];
					cout<<endl;
					break;
			     }
		 }while(next_permutation(a,a+n));
	}
	return 0;
}


正确代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,sum,i;
    int a[11],b[11][11];
    while(cin>>n>>sum)
    {
        for(i=0; i<n; i++)
            a[i]=i+1;
        do
        {
            for(i=0; i<n; i++)
                b[0][i]=a[i];
            for(int j=1; j<n; j++){
                for(int k=0; k<n-j; k++)
                    b[j][k]=b[j-1][k]+b[j-1][k+1];
            }

            if(b[n-1][0]==sum)
            {
                cout<<a[0];
                for(i=1; i<n; i++)
                    cout<<" "<<a[i];
                cout<<endl;
                break;
            }

        }
        while(next_permutation(a, a + n));
    }
    return 0;
}

第二个题目:

Description

The stores manager has sorted all kinds of goods in an alphabetical order of their labels. All the kinds having labels starting with the same letter are stored in the same warehouse (i.e. in the same building) labelled with this letter. During the day the stores manager receives and books the orders of goods which are to be delivered from the store. Each order requires only one kind of goods. The stores manager processes the requests in the order of their booking.  

You know in advance all the orders which will have to be processed by the stores manager today, but you do not know their booking order. Compute all possible ways of the visits of warehouses for the stores manager to settle all the demands piece after piece during the day.  

Input

Input contains a single line with all labels of the requested goods (in random order). Each kind of goods is represented by the starting letter of its label. Only small letters of the English alphabet are used. The number of orders doesn't exceed 200.  

Output

Output will contain all possible orderings in which the stores manager may visit his warehouses. Every warehouse is represented by a single small letter of the English alphabet -- the starting letter of the label of the goods. Each ordering of warehouses is written in the output file only once on a separate line and all the lines containing orderings have to be sorted in an alphabetical order (see the example). No output will exceed 2 megabytes.  

Sample Input

bbjd

Sample Output

bbdj
bbjd
bdbj
bdjb
bjbd
bjdb
dbbj
dbjb
djbb
jbbd
jbdb
jdbb

题目大意:输入一行代表商品标签的其实字母的字符串,然后求出其所有可能出现的排列方式

这个题目第一次做的的时候WA了,因为忘了一个关键点,next_permutation函数只会从当前输入的字典序排起,直到最大字典序出现,而题目要求是按顺序输出所有能的排列方式,所有在排列之前必须用sort函数对字符串进行排序!!!!!!


代码如下:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
	int i;
	string str;
	while(cin>>str)
	{
		sort(str.begin(),str.end());//必须排序
		do{
			for(i=0;i<str.length();i++)
				cout<<str[i];
			cout<<endl;
		}while(next_permutation(str.begin(), str.end()));//只会从当前输入的字典序排起,直到最大字典序出现
	}
	return 0;
}








  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值