洛谷 P1618 & STL全排列方法

今天在做洛谷上暴力专项训练,在解P1618题目的过程中发现了STL中全排列在解题中的妙用,特在此分享。

首先让我们先来看一下这道题:

P1618三连击(升级版)

题目描述
将 1, 2,…,9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!。

输入格式
三个数,A,B,C。

输出格式
若干行,每行 3 个数字。按照每行第一个数字升序排列。

输入样例
1 2 3

输出样例
192 384 576
219 438 657
273 546 819
327 654 981

说明/提示
保证 A<B<C。


很简单的一道暴力题,相信各位看完题目都有自己的想法了,我刚看完题目第一反应就是暴力全遍历一遍,就写了9层for循环,然后对每层循环加限制条件,打了七八十行代码又调试了半天才A掉,过题后看了下其他人的题解,发现有人用STL中的next_permutation方法很简洁的就过了。

那么让我们来看一下这个全排列方法的介绍与用法:

next_permutation全排序方法介绍

template<class Iterator>bool next_permutation (Iterator first, Iterator last);template<class Iterator, class Compare>bool next_permutation (Iterator first, Iterator last, Compare comp);

next_permutation方法原型主要有以上两种,此方法对一个可以遍历的集合按照一定的排列顺序排列到下一个排列,如果存在这样的下一个排列,执行并返回true,否则返回false,需要注意的是此方法是改变当前集合,而不是返回一个新集合。

有点不明白?没关系,举一个简单的例子你就理解了,字符串"abc",在字典序中全排列为:
“abc”,“acb”,“bac”,“bca”,“cab”,“cba”

那么我们通过执行以下代码:

  string s = "bac";next_permutation(s.begin(), s.end());cout << s;

就会输出 “bca”

如果我们想输出“abc”完整的全排序序列,我们可以这样做:

  string s = "abc";do {cout << s << endl;} while (next_permutation(s.begin(), s.end()));

输出结果为:

abc
acb
bac
bca
cab
cba

是不是用起来很方便,代码也很简洁,那么让我们看看刚才那道题如何用next_permutation方法解决:

P1618三连击(升级版)全排列方法AC代码

话不多说,直接放代码,一目了然。

#include<bits/stdc++.h>
using namespace std;
int main()
{int A,B,C;cin >> A >> B >> C;int flag=0;//flag标记是否有解int num[9]={1,2,3,4,5,6,7,8,9};do{int n1=num[0]*100+num[1]*10+num[2];int n2=num[3]*100+num[4]*10+num[5];int n3=num[6]*100+num[7]*10+num[8];//直接按顺序分配数字if(n1*B==n2*A&&n1*C==n3*A){flag=1;cout << n1 << " " << n2 << " " << n3 << endl;}}while(next_permutation(num,num+9));if(flag==0)cout << "No!!!" << endl;return 0;
}

往往简单的题目里藏着许多巧妙的方法,就算是自己AC过的题,也不妨看看别人的题解,或许会有意想不到的收获!

洛谷 P1618 STL全排列方法相关推荐

  1. 三连击(升级版)题解(洛谷P1618)

    看了洛谷的几篇题解之后,感觉自己的代码思路更明确,洛谷那边也交不上题解了,就只好写在这里咯~ 先直接放题目吧~ 思路 当模拟题来做,先枚举第一个数,首先要明确对一个数是否合法的几个条件: 1. 各个位 ...

  2. 洛谷P1618 Java解法

    题目出处:https://www.luogu.com.cn/problem/P1618 思路: 从结果入手 先在123-987中找到满足A:B:C的三个数 再判断三个数的各个数字是否有重复的 pack ...

  3. 洛谷p1618 三连击(升级版)(python)

    题目:用1-9组成三个数字各不重复的三位数,使这三个三位数满足一定的比例关系,算出所有解.若无解,输出"No!!!" 这道题当时想了好久,以下我觉得很好的一个思路是一位朋友给我的. ...

  4. 题解【洛谷】P1706 全排列问题

    题目描述: 点击进入题目 输出自然数 1到 n 所有不重复的排列,即 n的全排列(数量:n!),要求所产生的任一数字序列中不允许出现重复的数字. 题意理解: 这是一道dfs模板题,输入进来一个n,从第 ...

  5. 【DFS】洛谷P1706:全排列问题(C++)

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 n(1≤n≤9) 输出格式 由1-n组成的所有不重复的数字序列,每行一个序列.每个 ...

  6. 三连击(升级版)(洛谷-P1618)

    题目描述 将1,2,-,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出"No!!!". 输入输出格式 输入 ...

  7. 暴力枚举——三连击(洛谷 P1618)

    分析: 按照套路,先找可枚举的元素:3个3位数 可以9重for来枚举,但很显然会超时,所以我们需要去掉一些枚举的数, 因为事先给定了比例,所以我们可以枚举第一3位数来确定另外两个,但是另外两个是不一定 ...

  8. 洛谷P1618 三连击(升级版)C语言 暴力枚举 详解

    题目描述 将 1, 2,\ldots, 91,2,-,9 共 99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:CA:B:C,试求出所有满足条件的三个三位数,若无解,输出 No ...

  9. 洛谷-P1618 三连击(升级版)

    题目描述 将1,2,-,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出"No!!!". 输入格式 三个数, ...

最新文章

  1. python手机版idle-Python IDLE下载
  2. win8网速怎么测试软件,Windows8小技巧:查看当前网速
  3. NYOJ 888 取石子(九)
  4. mysql聚簇索引的页分裂原理实例分析
  5. LocalDB 静默安装
  6. 2021牛客OI赛前集训营-树数树【树上启发式合并,堆】
  7. P3850-[TJOI2007]书架【Splay】
  8. 前端学习(2905):用vite的2.0构建程序
  9. jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用...
  10. vue ani_ANI的完整形式是什么?
  11. Struts 2 的Action详解(三)
  12. 关于oracle的物理dg,单机上创建物理DG(Oracle 10g单实例)
  13. live2d动态壁纸android,Live2d动态壁纸
  14. android静态库动态库,Android 动态库和静态库
  15. 王凯1987计算机系,王凯-专家人物-中国水网
  16. 美图公司去年净利润8510万,“炒币”浮盈近4亿元
  17. matlab 多项式降幂,MATLAB自动将向量元素按降幂顺序分配给各系数值.PPT
  18. Mathematica 作图详解
  19. 电脑怎么翻译图片中的文字?快速翻译图片文字的方法
  20. 【元胞自动机】元胞自动机双边教室疏散【含Matlab源码 1208期】

热门文章

  1. 快速离散fr%C3%A9chet距离
  2. 《俗人笔记》之《Java基础语法上》
  3. 同位素标记其他的研究方法和技术
  4. 3大利器推荐,帮你写出规范漂亮的python代码
  5. npm安装依赖至指定版本 npm依赖升级
  6. WIN10+CGAL+VS2017配置
  7. 计算机不识别u盘咋办,电脑无法识别u盘如何修复,电脑不识别u盘怎么办
  8. 黑洞大作战游戏架构设计与实现
  9. 【惊了】迅雷下载速度竟然比不上虚拟机中的下载速度
  10. 批量登录qq空间,点击推广链接,增加点击量