Luogu2524 Uim的情人节礼物
Posted shiina-rikka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
以上是关于Luogu2524 Uim的情人节礼物的主要内容,如果未能解决你的问题,请参考以下文章