zoukankan      html  css  js  c++  java
  • Luogu2524 Uim的情人节礼物

    STL 大法好

    先来说一下这次要用到的函数吧:

    prev_permutation (下一个全排列)

    它的功能:

    把两个迭代器(或指针)指定的部分看作一个序列,求出这些元素构成的全排列中,字典序排在上一个的排列,并且直接在序列上更新。另外,若不存在排名更靠前的序列,则返回false,否则返回true。同理,也有next_permutation函数。 --《算法竞赛 进阶指南》

    那么,具体怎么用呢。for example:

    while(prev_permutation(data+1,data+n+1))

    只要有上一个全排列,它就会循环下去√

    至于next_permutation(下一个全排列),使用和prev_permutation一样,在此就不赘述了。

    现在来看这道题:

    用prev_permutation找回去就好了呀!
    上AC代码

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize("Ofast")
    #pragma GCC target ("avx2")
    //以上是玄学优化
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int data[10];
    int ans;
    inline void test()
    {
        for(register int i = 1; i <= n; i++)
            cerr<<data[i]<<" ";
        cerr<<endl;
    }
    //调试使用的函数,可以忽视,不过看看过程总是好的;
    int main()
    {
        // freopen("testdata.in","r",stdin);
        std::ios::sync_with_stdio(false);
        //关同步,小程序懒得写快读;
        cin>>n;
        int x = 0;
        cin>>x;
        //这个读入是有坑的,因为读入是一个整型,所以需要转换到数组里;
        //当然可以用getchar()实现
        for(register int i = 1; i <= n;i++)
        {
            data[i] = x % 10;
            x /= 10;
        }
        //倒着找到每一位
        reverse(data+1,data+n+1);
        // STL 的翻转函数,倒转一个序列;
        while(prev_permutation(data+1,data+n+1))
            ans++/*test()*/;
        cout<<ans+1;
        //因为当前序列也算所以++;
        return 0;
    }
  • 相关阅读:
    显因子模型简介
    关联规则中最小支持度和最小置信度
    Matlab读取音频数据
    初识禁忌搜索算法
    Word中将图表变为表格
    明尼苏达推荐系统导论(第一课 欢迎来到RS)
    python复杂网络分析库NetworkX
    python使用zlib实现压缩与解压字符串
    PostgreSQL 对字段大小写敏感
    pycharm快捷键及一些常用设置
  • 原文地址:https://www.cnblogs.com/Shiina-Rikka/p/11223656.html
Copyright © 2011-2022 走看看