2 条题解

  • 1
    @ 2022-6-12 10:26:08
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,a[10005];
    int main(){
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    	}
    	for(int i=1;i<=m;i++){
    		next_permutation(a+1,a+n+1);//算这个a+1~a+n+1这个排列的下一个排列 
    	}
    	for(int i=1;i<=n;i++){
    		cout<<a[i]<<' ';
    	} 
    	return 0;
    }
    
    • 0
      @ 2022-3-27 17:13:41

      我又来发题解了

      思路

      直接模拟,但是有不同。 火星人手指的排列顺序每进入下一次排列就意味着表示的数字加一,所以直接用algorithm库当中的next_permutation函数即可

      不会next_permutation的小朋友看这里 (备注:由于某些原因这是镜像,原来的网站需要VPN或代理才可以访问)

      大致解释:

      定义:

      C++20前

      template< class BidirIt >
      bool next_permutation( BidirIt first, BidirIt last );
      

      (由于考场的编译标准不为C++20,这里就不列举C++20起的定义了;同时为了方便我只列举这里使用的next_permutation定义,还有重载版本就不详细列出,不再赘述)

      解释

      参数

      first表示区间开始的地址,last表示区间结束地址的下一个地址;

      即函数执行的区间为[first,last)[\operatorname{first},\operatorname{last})

      返回值

      此函数返回值为bool,如果还有下一个排列则返回true,否则返回false

      举例

      int a[]={1,2,3,4,5};

      当重复执行数次next_permutation(a,a+5)(返回值为true,直到a={5,4,3,1,2},再次执行,则返回值为false

      算法

      火星人手指表示的数要加MM,那么我们就执行MM次排列即可

      代码(请勿抄袭

      #include<iostream>
      #include<cstdio>
      #include<cmath>
      #include<algorithm>
      #include<vector>
      using namespace std;
      vector<int>v;
      int main(){
          int N,M,p;
          scanf("%d%d",&N,&M);
          for(int i=0;i<N;i++){
              scanf("%d",&p);
              v.push_back(p);
          }
          for(int i=0;i<M;i++){
              next_permutation(v.begin(),v.end());
          }
          for(int i=0;i<N;i++){
              printf("%d ",v.at(i));
          }
          return 0;
      }
      
      • @ 2022-4-9 20:37:08

        代码我没有加注释哈

    • 1

    信息

    ID
    89
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    8
    已通过
    8
    上传者