next

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    目录

    前言

    简要概述

    例题1

    P1088 [NOIP2004 普及组] 火星人

    题目描述

    输入格式

    输出格式

    输入输出样例

    说明/提示

    代码1

    例题2

    P1706 全排列问题

    题目描述

    输入格式

    输出格式

    输入输出样例

    说明/提示

    代码2

            

    前言

     在我们的日常刷题中总会遇到一些题是不会的在不会的时候我们首先想到的是看答案在算法题遇到不会时候也是这样不会先看题解在题解中学会思路方法师夷长技以制夷最后增加自己的本领。

    简要概述

    next_permutation函数bool类型是STL中计算排列组合的方法在比赛或者练习过程中可以使用next_permutation函数的参数是数组的区间坐标两个始如a+0末如:a+nn个数)

    比如现在起始排列为123调用next_permutation函数后会把下一次排列的结果保存入数组a中全排列的顺序是一定的当全排列到达最后没有全排列时返回false

    例题1

    P1088 [NOIP2004 普及组] 火星人

    题目描述

    人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的首先火星人把一个非常大的数字告诉人类科学家科学家破解这个数字的含义后再把一个很小的数字加到这个大数上面把结果告诉火星人作为人类的回答。

    火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手但这只手上有成千上万的手指这些手指排成一列分别编号为 1,2,3,⋯1,2,3,⋯。火星人的任意两根手指都能随意交换位置他们就是通过这方法计数的。

    一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为 1,2,3,41,2,3,4 和 55当它们按正常顺序排列时形成了 55 位数 1234512345当你交换无名指和小指的位置时会形成 55 位数 1235412354当你把五个手指的顺序完全颠倒时会形成 5432154321在所有能够形成的 120120 个 55 位数中1234512345 最小它表示 11;1235412354 第二小它表示 22;5432154321 最大它表示 120120。下表展示了只有 33 根手指时能够形成的 66 个 33 位数和它们代表的数字

    三进制数代表的数字
    12312311
    13213222
    21321333
    23123144
    31231255
    32132166

    现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指科学家会告诉你要加上去的很小的数。你的任务是把火星人用手指表示的数与科学家告诉你的数相加并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。

    输入格式

    共三行。
    第一行一个正整数 �N表示火星人手指的数目1≤�≤100001≤N≤10000。
    第二行是一个正整数 �M表示要加上去的小整数1≤�≤1001≤M≤100。
    下一行是 11 到 �N 这 �N 个整数的一个排列用空格隔开表示火星人手指的排列顺序。

    输出格式

    �N 个整数表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开不能有多余的空格。

    输入输出样例

    输入 #1复制

    5
    3
    1 2 3 4 5
    

    输出 #1复制

    1 2 4 5 3

    说明/提示

    对于 30%30% 的数据�≤15N≤15。

    对于 60%60% 的数据�≤50N≤50。

    对于 100%100% 的数据�≤10000N≤10000。

    noip2004 普及组第 4 题

    代码1

    # include<bits/stdc++.h>
    using namespace std;      //命名空间 
     int n,m;
     int a[10001] ; //a来存储值 
     int main()
     {
     	cin>>n>>m;
     	for(int i=0;i<n;i++)
     	{
     		cin>>a[i];
    	 }
    	 for(int i=0;i<m;i++)
     	next_permutation(a,a+n);
     	for(int i=0;i<n;i++)
     	{
     		cout<<a[i]<<" ";
    	 }
     }

    例题2

    P1706 全排列问题

    题目描述

    按照字典序输出自然数 11 到 �n 所有不重复的排列即 �n 的全排列要求所产生的任一数字序列中不允许出现重复的数字。

    输入格式

    一个整数 �n。

    输出格式

    由 1∼�1∼n 组成的所有不重复的数字序列每行一个序列。

    每个数字保留 55 个场宽。

    输入输出样例

    输入 #1复制

    3

    输出 #1复制

        1    2    3
        1    3    2
        2    1    3
        2    3    1
        3    1    2
        3    2    1
    

    说明/提示

    1≤�≤91≤n≤9。

    代码2

    # include <bits/stdc++.h>
    using namespace std;
     int a[13];
     int n;
     int main()
     {
     	cin>>n;
     	for(int i=0;i<n;i++)
     	{
     		a[i]=i+1;
    	 }
    	 do{
    	 for(int i=0;i<n;i++)
     	{
     	cout<<setw(5)<<a[i];
    	 }
    	 cout<<endl;
    	 }
    	 while(next_permutation(a,a+n));
    
     }


            

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6