zoukankan      html  css  js  c++  java
  • 洛谷 P2525 Uim的情人节礼物·其之壱

    题目描述

    情人节到了,Uim打算给他的后宫们准备情人节礼物。UIm一共有N(1<=N<=9)个后宫妹子(现充去死 挫骨扬灰!)。

    为了维护他的后宫的稳定。他通过编程,得出了一个送礼物的最佳顺序。这个我们管不着。

    然而他认为,如果什么事情做得太圆满不是什么好事。于是他希望得到 原定顺序 的 前一个字典序的序列。

    输入格式

    第一行一个整数N

    第二行N个整数,表示原定排列

    输出格式

    前一个排列

    源代码

    #include<bits/stdc++.h>usingnamespacestd; int n,a[10000]; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; if(prev_permutation(a,a+n)) for(int i=0;i<n;i++) cout<<a[i]<<" "; elsecout<<"ERROR"; cout<<endl; return0; }

    这道题的代码中最核心的部分就是prev_permutation(a,a+n)

    next_permutation(start,end),和prev_permutation(start,end)。这两个函数作用是一样的,区别就在于前者求的是当前排列的下一个排列,后一个求的是当前排列的上一个排列。至于这里的“前一个”和“后一个”,我们可以把它理解为序列的字典序的前后,严格来讲,就是对于当前序列pn,他的下一个序列pn+1满足:不存在另外的序列pm,使pn<pm<pn+1。

    所以可以用if进行判断,当当前序列不存在下一个排列时,函数返回false,否则返回true。

    next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。

    注:next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。

    之后只要输出得到的第一组排列即可。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,a[10000];
     4 int main()
     5 {
     6     cin>>n;
     7     for(int i=0;i<n;i++)
     8         cin>>a[i];
     9     if(prev_permutation(a,a+n)) 
    10         for(int i=0;i<n;i++)
    11             cout<<a[i]<<" ";
    12     else cout<<"ERROR";  
    13     cout<<endl;
    14     return 0;
    15 }
  • 相关阅读:
    c++ cout、cin、endl
    c++ namespace
    找到小镇的法官
    整数反转
    c++stack类的用法
    栈应用:最小栈(第二题)
    栈的压入、弹出序列(第一题)
    c++中vector类的用法
    Android 面试常问七道题
    传感器实现仿微信摇一摇功能
  • 原文地址:https://www.cnblogs.com/jd1412/p/12396620.html
Copyright © 2011-2022 走看看