PJ可能会考的模拟与枚举-自学教程

文/Pleiades_Antares

之前学校里看一个小可爱复习的时候偷偷听来着XD
简单记了一下重点吧,希望能对看官您有所帮助XD

以下⬇️是几个复习时讲过的题,里面放了一下笔记啦!重点是笔记和方法昂

然后过几天我会出一个NOIP初赛复习的帖子吧带着大家过一遍。

程序是次要的重点是理解+文字,因为是上课顺便记的草稿,所以很多是不全的orz
表达式求值
  1. //
  2. // 表达式求值.cpp
  3. //
  4. //
  5. //
  6. //scanf
  7. //"%[]"
  8. //luoguP1981
  9. #include <cstdio>
  10. #include<iostream>
  11. using namespace std;
  12. const int maxn=100050;
  13. int a[maxn];
  14. char op[maxn];
  15. int main(){
  16. int n=0;
  17. while(scanf("%d%[+*]",&a[n],&op[n])==2) {
  18. n++;
  19. }
  20. n++;
  21. //不结束就一直乘下去
  22. int ans=0;
  23. for(int i=0;i<n;i++){
  24. int t=a[i]%10000;
  25. for(;i<n&&op[i]=='*';i++){
  26. t*=a[i+1];
  27. t%=10000;
  28. }
  29. ans+=t;
  30. ans%=10000;
  31. }
  32. printf("%d\n",ans);
  33. return 0;
  34. }
寻宝
  1. //
  2. // 寻宝.cpp
  3. //
  4. //
  5. //
  6. //
  7. #include <cstdio>
  8. #include<iostream>
  9. using namespace std;
  10. int main(){
  11. return 0;
  12. }
  13. //模拟这里常见的问题
  14. //模拟题目需要清晰的思路,找到尽量简洁的实现,这些取决于平时的积累也就是刷题量。这方面代码能力的提升不仅是靠刷模拟题,在做各种题目的时候,注意其代码实现的方式,也可以参考一些经验丰富的人的做法,这一点在以后的学习之路上都是适用的。
选数
  1. //
  2. // 选数.cpp
  3. //
  4. //
  5. //
  6. //
  7. //P1036
  8. //枚举精讲内容题目1
  9. #include <cstdio>
  10. #include<iostream>
  11. using namespace std;
  12. const int maxn=25;
  13. int n,k;
  14. int x[maxn];
  15. int ans;
  16. bool isPrime(int a){
  17. if (a==2||3) return 1;
  18. for(int i=2;i*i<=a;i++){
  19. if (a%i==0) return 0;
  20. }
  21. return 1;
  22. }
  23. void dfs(int cnt,int now,int sum){
  24. if (now==n){
  25. if (cnt==k&&isPrime(sum)){
  26. ans++;
  27. }
  28. }
  29. else{
  30. dfs(cnt,now+1,sum);
  31. dfs(cnt+1,now+1,sum+x[now]);
  32. }
  33. }
  34. int main(){
  35. cin>>n>>k;
  36. for(int i=1;i<=n;i++){
  37. cin>>x[i];
  38. }
  39. dfs(0,0,0);
  40. cout<<ans<<endl;
  41. return 0;
  42. }
  43. //DFS枚举
  44. //非常重要的一段DFS代码!!
  45. int ans;
  46. int a[maxn];
  47. int n,k;
  48. void dfs(int now,int cnt,int s){
  49. if (now==n){
  50. if (cnt==k&&isPrime(s)){
  51. ans++;
  52. }
  53. }
  54. else{
  55. dfs(now+1,cnt,s);//第一种情况,不选这个数
  56. dfs(now+1,cnt+1,s+a[now]);//选了的话
  57. }
  58. }
  59. dfs(0,0,0);
  60. //DFS枚举排列
  61. int ans,n,p[maxn];
  62. bool flag[maxn];
  63. void dfs(int now){
  64. if (test(p)) {
  65. ans++;
  66. }
  67. else {
  68. for(int i=1;i<=n;i++){
  69. if (!flag[i]){
  70. p[now]=i;
  71. flag[i]=true;
  72. dfs(now+1);
  73. flag[i]=false;
  74. }
  75. }
  76. }
  77. }
  78. dfs(0);
  79. //DFS:用递归来枚举很多很多的变量
  80. //图论DFS是寻找最短路,但是这个主要是寻找解什么的...
  81. //更高效的枚举集合
  82. //前置知识:位运算
  83. //将最低位记作第0位,二进制表示第i位为1则表示取集合中的第i位元素
  84. for(int state=0;state<(1<<n);state++){
  85. int s=0;
  86. for(int i=0;i<n;i++){
  87. if (state&(1<<i)){
  88. s+=a[i];
  89. }
  90. }
  91. }
  92. //更高效的枚举排列
  93. //algorithm
  94. //std::next_permutation
  95. //std::prev_permutation
  96. //STL中的函数,接受两个参数表示数组的起止位置。
  97. //会将数组变为对应的下/上一个排列
  98. //如果当前数组是最后一个排列,则变为第一个排列,并且返回false,否则返回true
  99. //时间复杂度O(n)
  100. #include<algorithm>
  101. int p[maxn];
  102. for(int i=0;i<n;i++){
  103. p[i]=i+1;
  104. }
  105. do{
  106. test(p);
  107. }while(std::next_permutation(p,p+n));
  108. //test是啥?比如判断是否是最优的解或者计数的东西等等等等...
火星人
  1. //
  2. // 火星人.cpp
  3. //
  4. //
  5. //
  6. //
  7. #include<cstdio>
  8. #include<iostream>
  9. #include<algorithm>
  10. using namespace std;
  11. const int maxn=10005;
  12. int n;
  13. int m;
  14. int a[maxn];
  15. int main(){
  16. cin>>n>>m;
  17. for(int i=1;i<=n;i++){
  18. cin>>a[i];
  19. }
  20. for(int i=1;i<=m;i++){
  21. next_permutation(a+1,a+1+n);
  22. }
  23. for(int i=1;i<=n;i++){
  24. cout<<a[i]<<" ";
  25. }
  26. return 0;
  27. }
  28. //小结:以上两种方法,对特定的枚举都有显著减少代码长度和常数的优势
  29. //但是当无用状态较多的时候,DFS可以设计各种剪枝优化,能过掉更大的数据
导弹拦截,只给思路
  1. //
  2. // 导弹拦截.cpp
  3. //
  4. //
  5. // Created by demi on 2018/10/1.
  6. //
  7. #include<iostream>
  8. #include<cstdio>
  9. using nameespace std;
  10. int n;
  11. struct T {
  12. ll d1,d2;
  13. T(){}
  14. }
  15. int n;
  16. int
  17. //由于实际要取的是数组后缀的导弹距离第二个系统距离最大值,可以预处理
  18. //按照后缀从短到长处理,每次添加一个导弹,维护最大值
另外一道经典题目
  1. //
  2. // another练习.cpp
  3. //
  4. //
  5. //
  6. //
  7. //题目描述
  8. //给出一个正整数集合,求出有多少组数,满足(a+b-c)*d/e=f,且六个数均在集合内
  9. //注:
  10. int cnt[maxn],ans;
  11. for(int f=0;f<n;f++){
  12. cnt[x[f]]++;
  13. }
  14. for(int a=0;a<n;a++){
  15. for(int b=0;b<n;b++){
  16. for(int c=0;c<n;c++){
  17. for(int d=0;d<n;d++){
  18. for(int e=0;e<n;e++){
  19. ans+=cnt[(x[a]+x[b]-x[c])*x[d]/x[e]];
  20. }
  21. }
  22. }
  23. }
  24. }
  25. //难道要这个样子吗?
  26. //错误1:没有处理不能整除(WA)
  27. //错误2:没有判断负数(RE)
  28. //Meet-in-他和-middle
  29. int cnt[maxn],ans;
  30. for(int f=0;f<n;f++){
  31. for(int e=0;e<n;e++){
  32. for(int d=0;d<n;d++){
  33. if (!x[f]*f[e]%f[d]&& x[f]*f[e]/f[d] < maxn ){
  34. cnt[x[f]*f[e]/f[d]]++;
  35. }
  36. }
  37. }
  38. }
  39. for(int a=0;a<n;a++){
  40. for(int b=0;b<n;b++){
  41. for(int c=0;c<n;c++){
  42. if (x[a]+x[b]-x[c])
  43. }
  44. }
  45. }
  46. //有多个变量需要枚举时,可以枚举一部分,计算出中间值
  47. //再枚举另一个部分,寻找是否有对应的中间值
  48. //寻找部分可用到二分查找或者std::set
经典题目+1
  1. //
  2. // 经典题目加一.cpp
  3. //
  4. //
  5. //
  6. //
  7. #include<iostream>
  8. #include<cstdio>
  9. using namespace std;
  10. //思路1:枚举每个区间的左右端点,再循环求和,O(n三次方)
  11. //思路2:枚举左端点后考虑合法的右端点,
  12. //可以发现是左端点后面的一段连续区间
  13. //找到最大的右端点,计数即可。O(n方)
  14. Two-Pointers
  15. int ans=0;
  16. int l,r,tsum;
  17. for(l=0;l<n;l++){
  18. for(;tsum+a[r]<=k&&r<n;r++){
  19. tsum+=a[r];
  20. }
  21. ams+=r-l;
  22. tsum-=a[l];
  23. }

然后说明一下MAC端怎么编程

Xcode很好用呐完全不需要用在线IDE(当然有一些特别好看还是值得用的233)

据说很火的sublime是编辑器不是编译器!!!

but很多人不会用xcode

这里说一下:

运行terminal配合xcode完全OK

mac os应该是内置的g++和c++

输入如下图指令(图片来源:洛谷IDdemi用户,已获得授权)



可能我太老了还在用原始方法吧qwq

PJ可能会考的模拟与枚举-自学教程的更多相关文章

  1. 清北学堂—2020.1提高储备营—Day 1 morning(模拟、枚举、搜索)

    qbxt Day 1 morning --2020.1.17 济南 主讲:李佳实 目录一览 1.模拟和枚举 2.基础搜索算法(DFS.BFS.记忆化搜索)以及进阶搜索算法(纯靠自学) 总知识点:基础算 ...

  2. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  3. HMM 自学教程(八)总结

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在HMM 学习最佳范例,这是针对国外网站上一个 HMM 教程的翻译,作者功底很深,翻译得很精彩,且在 ...

  4. HMM 自学教程(七)前向后向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  5. HMM 自学教程(六)维特比算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  6. HMM 自学教程(五)前向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  7. HMM 自学教程(四)隐马尔科夫模型

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  8. HMM 自学教程(三)隐藏模式

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  9. HMM 自学教程(二)生成模型

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

随机推荐

  1. NGINX 加载动态模块(NGINX 1.9.11开始增加加载动态模块支持)

    NGINX 1.9.11开始增加加载动态模块支持,从此不再需要替换nginx文件即可增加第三方扩展.目前官方只有几个模块支持动态加载,第三方模块需要升级支持才可编译成模块. tinywan@tinyw ...

  2. Spring Boot + Spring Cloud 构建微服务系统(五):熔断监控面板(Hystrix Dashboard)

    Hystrix Dashboard Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Comma ...

  3. 线段树(segment tree)

    线段树是一种二叉搜索树,它的每一个结点对应着一个区间[L, R],叶子结点对应的区间就是一个单位区间,即L == R.对于一个非叶子结点[L, R],它的左儿子所表示的区间是[L, (L +R)/2] ...

  4. 数据分析之pandas模块

    一.Series 类似于一位数组的对象,第一个参数为数据,第二个参数为索引(索引可以不指定,就默认用隐式索引) Series(data=np.random.randint(1,50,(10,))) S ...

  5. Apollo 1 融合 Spring 的三个入口

    前言 Spring 作为 Java 世界非官方标准框架,任何一个中间件想要得到良好的发展,必须完美支持 Spring 的各种特性,即:无缝融入 Spring. Apollo 作为分布式配置中心,服务于 ...

  6. Django学习(6)配置静态文件

      本文将详细讲述如何在Django中配置静态文件,如图片(images),JavaScript,CSS等.   我们将要实现的网页如下: 当按下按钮"Change Text"时, ...

  7. [转]Angular4---部署---将Angular项目部署到IIS上

    本文转自:https://www.cnblogs.com/kingkangstudy/p/7699710.html Angular项目部署到一个IIS服务器上 1.安装URL rewrite组件: 网 ...

  8. 支持开源,推动Orchard

    希望正在研究果园,和对果园感兴趣的,加入Orchard高级开发群,进行交流和讨论及深入研究Orchard开发,我们致力寻求志同道合推动Orchard发展的屌丝!!! 干净.专注.社区力量的圈子

  9. [总结]jQuery之选择器集合

    jQuery 的选择器可谓之强大无比,常用的元素查找方法: $("#myELement") //选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是my ...

  10. 能用HTML/CSS解决的问题,就不要用JS

    原因:简单. 简单就意味着更快的开发速度,更小的维护成本,同时往往具有更好的体验. 一,导航高亮 效果图: 代码: <!DOCTYPE html> <html lang=" ...