洛谷C++简单题练习day7—P2524 Uim的情人节礼物

day7--P2524 Uim的情人节礼物--1.27

习题概述

Uim 成功地按照顺序将礼物送到了 N 个同学的手里并维持她们的和谐。

现在 Uim 现在想知道,他最终选择的顺序是所有给 N 个同学送礼顺序中,字典序  第几小的。送礼顺序可以看作1,2,⋯,N 的一个排列。

输入格式

第一行一个整数 N,表示有 N 个数。

第二行一个整数 X,表示给出的排列。

输出格式

一个整数,表示是第几小的字典序。

洛谷C++简单题练习day7—P2524 Uim的情人节礼物_第1张图片

代码部分 

#include//万能头 
using namespace std;
//定义的函数bj用于比较两个数组是否相同 
bool bj(int *a,int *b,int n)//接受两个整型指针参数a和b,一个整数n表数组的大小
{
    for(int i=0;i> n; // 读入n
    //读取n个整数将它们依次存储到数组a中
    for (int i = 0; i < n; i++)
        cin >> a[i];
    //用于将数组b赋值为从1到n的连续整数序列为{1,2,...,n}
    for (int i = 0; i < n; i++)
        b[i] = i + 1; 
    while (!bj(a, b, n)) // 如果两个数组不相同
    {
        next_permutation(b, b + n); // 制造下一个全排列
        s++; // 计数
    }
    cout << s << endl; // 输出计数答案
    return 0;
}

心得体会

1.这道题的意思是给定一个长度为N的排列a,要求确定这个排列在所有可能的长度为N的排列中的字典序排名。

字典序是一种排序方式,它根据元素的大小和位置来确定元素的顺序。对于长度为N的排列,字典序从小到大的排列方式是按照每个位置的元素从小到大由于题目中说第几小的)排序。

例如,对于N=3的排列,字典序排列如下:

  • 1 2 3
  • 1 3 2
  • 2 1 3
  • 2 3 1
  • 3 1 2
  • 3 2 1

题目要求:给定排列a在所有可能的长度为N的排列中的字典序排名。

代码通过生成所有可能的长度为N的排列,并逐个与给定排列a进行比较,直到找到与a相同的排列为止。期间使用计数变量s记录所生成的排列的个数,最终输出s的值,即为给定排列a的字典序排名。

2.  next_permutation是C++标准库中的一个函数,它位于  头文件中。它用于生成指定范围内元素的下一个字典序排列。

函数原型如下:

template
bool next_permutation(ForwardIt first, ForwardIt last);

该函数接受两个迭代器参数 first 和 last,表示一个范围。它会将范围内的元素重新排列成下一个字典序排列,并返回 true。如果当前排列已经是最后一个字典序排列,那么函数会将范围中的元素重新排列为第一个字典序排列,并返回 false

3. next_permutation(b, b + n) 将数组 b 的范围从 b 到 b + n不包括 b + n)内的元素重新排列为下一个字典序排列。

例如,如果 b 的初始值为 {1, 2, 3},调用 next_permutation(b, b + 3) 将会将 b 的值更改为 {1, 3, 2},因为 {1, 2, 3} 是字典序排列中的第一个排列,而 {1, 3, 2} 是下一个字典序排列。

next_permutation 函数在解决排列组合、排序和遍历所有可能排列的问题时非常有用。它可以通过不断调用来生成全排列,直到达到所需的排列或者生成了所有可能的排列。

你可能感兴趣的:(蓝桥备战冲!,c++,算法,开发语言,数据结构,学习)