枚举(蓝桥杯备赛系列)acwing版

                                                枚举

                                                 前言

               hello,大家好,前面一段时间已经是把acwing Linux基础课讲完了,其实那些内容完全可以带领小白入门Linux我说过如果有人留言要Linux和Windows server 配置DNS Web ftp 的内容我就做一期,但是没人留言我也就先不自作多情了不过后面有人留言的话我还是会继续做的,按照计划我开始讲蓝桥杯备赛系列了。

        因为蓝桥杯是分为研究生组、A组B组C组四个赛道的,他的要求是B组必须掌握B组以及C组的内容,A组掌握B组以及C组的内容,所以先给大家列一下提纲,我逐个知识点开始讲解,然后不光是讲知识点还有我们的计划就是在Linux基础课最后一节我写过了,哈哈哈哈在这再讲一下,1.讲知识点(acwing版的)、例题、模板2.讲蓝桥杯这个知识点对应的历年题目3.讲紫皮书里面对知识点有用的知识4.讲官网上的备战思路和双周赛的题目。争取实现看过的同学并且跟着一块学习的同学能起码混个省奖也不枉费300大洋的报名费用。不多bb上内容

  • 一、大学C组

    • 1、枚举:

    • 2、排序入门

    • 3、搜索

    • 4、贪心

    • 5、模拟:

    • 6、二分

    • 7、基础动态规划

    • 8、高精度

    • 9、数据结构

    • 10、数学

  • 二、大学B组

    • 11、排序进阶

    • 12、搜索

    • 13、进阶动态规划

    • 14、字符串

    • 15、图论

    • 16、数学

    • 17、数据结构

    • 18、计算几何                                                                                                                    

    •   模板

    • 要问枚举有什么模板没?

    • 我的答案是 暴力枚举,相信大家对暴力枚举都不陌生,也经常能在各大oj平台上看到诸如这个题暴力能不能解之类的讨论,许多题其实都可以暴力枚举,只是大部分题目都可能会超时,但是超时是超出了oj平台对改题目设置的限定时间,蓝桥杯的填空题可没有超时这个说法,只需要填写答案,而且许多编程

      题暴力枚举也能拿不少分,那么我们为什么不选择更容易想到的暴力枚举呢?

      大家都知道枚举简单,不就是把所有情况都列举出来吗,但是在实际写的时候,很多人并没有使用或者第一时间选择枚举,难道是害怕超时吗?经过了解几个小伙伴的想法后才知道原来大家不是不想用枚举,也不是不了解枚举,而是不知道该如何进行有效的枚举。

      2.枚举模板
      我个人对可以枚举题目的理解结合oj平台上一些大佬的经验,总结出一个基本思想和一个大白话的模板

      一个基本思想: 怎么简单怎么来,能for就for,不能for就while

      一个白话模板:

      1.找到要进行枚举的东西

      2.要枚举东西的特性

      3.枚举的上下边界

      4.符合条件的判断

      5.能否在枚举的基础上简单优化(视情况判断是否省略)

      我们根据一个基本思想和一个白话模板结合往年蓝桥杯真题实践实践

    • 悄悄告诉你们!!!我认为蓝桥杯的枚举小题填空直接用表格去做或者计算机算,大题无非就是暴力能做但是能不能ac看运气,基本上都要有一定的巧法才能完全ac,要不然一个大题考你暴力就没啥意思了

    • 真题练习

    • 先上一个小开胃菜
    • 1.马虎的算式
          小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

          有一次,老师出的题目是:36 x 495 = ?

          他却给抄成了:396 x 45 = ?

          但结果却很戏剧性,他的答案竟然是对的!!

          因为 36 * 495 = 396 * 45 = 17820

          类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

          假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

          能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

      请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

      满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

      答案直接通过浏览器提交。
      注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容

#include<iostream>
using namespace std;
int main(){int ans = 0;for(int a = 1;a < 10;a++){for(int b = 1;b < 10;b++){if(b==a) continue;for(int c = 1;c < 10;c++){if(c==a || c==b) continue;for(int d = 1;d < 10;d++){if(d==a||d==b||d==c) continue;for(int e = 1;e < 10;e++){if(e==a||e==b||e==c||e==d) continue;if((a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e)){ans++;}}}} }}cout << ans;return 0;
}

是不是有点蒙蒙没关系,给大家上一个纯暴力枚举的题目但是我提前声明一下!!这个题目用暴力只能解决一部分的数据没办法全部ac的正解需要用到前缀和或者二分双指针都可以,由于知识点没讲所以我放出暴力代码和正确代码但是后面讲到知识点的时候提一下正解咋来的自行理解一下吧先。

给定三个整数数组

A=[A1,A2,…AN]
B=[B1,B2,…BN]
C=[C1,C2,…CN]

请你统计有多少个三元组 (i,j,k) 满足:

  1. 1≤i,j,k≤N1
  2. Ai<Bj<Ck
输入格式

第一行包含一个整数 N

第二行包含 N个整数 A1,A2,…AN1

第三行包含 N 个整数 B1,B2,…BN

第四行包含 N 个整数 C1,C2,…CN

输出格式

一个整数表示答案。

数据范围

1≤N≤10000
0≤Ai,Bi,Ci≤1000000

输入样例:
3
1 1 1
2 2 2
3 3 3
输出样例:
27
#include<iostream>
using namespace std;
int main()
{int n;cin>>n;int ans=0;int a[n],b[n],c[n];for(int i=0;i<n;i++)scanf("%d",&a[i]);for(int i=0;i<n;i++)scanf("%d",&b[i]);for(int i=0;i<n;i++)scanf("%d",&c[i]);for(int i=0;i<n;i++){for(int j=0;j<n;j++){for(int k=0;k<n;k++){if(a[i]<b[j]&&b[j]<c[k])ans++;}}}cout<<ans;return 0;
}

正解:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int N = 100010;int n;
int a[N], b[N], c[N];
int as[N];  // as[i]表示在A[]中有多少个数小于b[i]
int cs[N];  // cs[i]表示在C[]中有多少个数大于b[i]
int cnt[N], s[N];int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]), a[i] ++ ;for (int i = 0; i < n; i ++ ) scanf("%d", &b[i]), b[i] ++ ;for (int i = 0; i < n; i ++ ) scanf("%d", &c[i]), c[i] ++ ;// 求as[]for (int i = 0; i < n; i ++ ) cnt[a[i]] ++ ;for (int i = 1; i < N; i ++ ) s[i] = s[i - 1] + cnt[i];   // 求cnt[]的前缀和for (int i = 0; i < n; i ++ ) as[i] = s[b[i] - 1];// 求cs[]memset(cnt, 0, sizeof cnt);memset(s, 0, sizeof s);for (int i = 0; i < n; i ++ ) cnt[c[i]] ++ ;for (int i = 1; i < N; i ++ ) s[i] = s[i - 1] + cnt[i];for (int i = 0; i < n; i ++ ) cs[i] = s[N - 1] - s[b[i]];// 枚举每个b[i]LL res = 0;for (int i = 0; i < n; i ++ ) res += (LL)as[i] * cs[i];cout << res << endl;return 0;
}

我再整个跟第一个类似的,基本上蓝桥杯考这样的比较多,问符合某种性质的数有多少

注意!这个题目里面有一个小模版就是如何把一个n位数的每一位数给单独调出来。

先放模板:

 while (x){int t = x % 10; // 取出x的个位x /= 10;    // 删掉x的个位
}

题目是这样的

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 11 到 n中,所有这样的数的和是多少?

输入格式

共一行,包含一个整数 n

输出格式

共一行,包含一个整数,表示满足条件的数的和。

数据范围

1≤n≤10000

输入样例:
40
输出样例:
574

再放题目答案:

#include <iostream>
#include <algorithm>using namespace std;int main()
{int n;cin >> n;int res = 0;for (int i = 1; i <= n; i ++ ){int x = i;while (x){int t = x % 10; // 取出x的个位x /= 10;    // 删掉x的个位if (t == 2 || t == 0 || t == 1 || t == 9){res += i;break;}}}cout << res << endl;return 0;
}

四平方和

题目描述

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。

比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)

对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开

例如,输入:
5
则程序应该输出:
0 0 1 2

再例如,输入:
12
则程序应该输出:
0 2 2 2

再例如,输入:
773535
则程序应该输出:
1 1 267 838
 

分析

声明一下:这个题目是思路我是跟着别人学的公式我也打不出来只能用一下图片的方式给大家放一下

#include<cstdio>
#include<cmath>
int n;
int main(){scanf("%d",&n);for(int i=0;i*i<=n;i++)for(int j=i;i*i+j*j<=n;j++)for(int k=j;i*i+j*j+k*k<=n;k++){int l=int(sqrt(n-i*i-j*j-k*k));if(i*i+j*j+k*k+l*l==n){printf("%d %d %d %d",i,j,k,l);return 0;}}	
}

放一个独立思考的题目下期出答案,毕竟自己思考出来的才是真香,练习亿下

2021 是一个非常特殊的数,它可以表示成两个非负整数的平方差,2021 = 45 * 45 - 2 * 2。
2025 也是同样特殊的数,它可以表示成 2025 = 45 * 45 - 0 * 0。
请问,在 1 到 2021 中有多少个这样的数?
请注意,有的数有多种表示方法,例如 9 = 3 * 3 - 0 * 0 = 5 * 5 - 4 * 4,在算答案时只算一次。
 

本次压轴题给大家送上,这个题暴力能做,还是那句话要有巧法才能ac,这个题就无非总结了蓝桥杯枚举的特点,以及它未来的考法方向,个人理解哈。

    • 小明这些天一直在思考这样一个奇怪而有趣的问题:

      在 1∼N 的某个排列中有多少个连号区间呢?

      这里所说的连号区间的定义是:

      如果区间 [L,R] 里的所有元素(即此排列的第 L个到第 R个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。

      当 N很小的时候,小明可以很快地算出答案,但是当 N 变大的时候,问题就不是那么简单了,现在小明需要你的帮助。

      输入格式

      第一行是一个正整数 N,表示排列的规模。

      第二行是 N 个不同的数字 Pi,表示这 N 个数字的某一排列。

      输出格式

      输出一个整数,表示不同连号区间的数目。

      数据范围

      1≤N≤10000,
      1≤Pi≤N

      输入样例1:
      4
      3 2 4 1
      
      输出样例1:
      7
      
      输入样例2:
      5
      3 4 2 5 1
      
      输出样例2:
      9
      
      样例解释

      第一个用例中,有 77 个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4][1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4]
      第二个用例中,有 99 个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[3,3],[4,4],[5,5]

      代码如下(优化过后的):

      #include <cstring>
      #include <iostream>
      #include <algorithm>using namespace std;const int N = 10010, INF = 100000000;int n;
      int a[N];int main()
      {cin >> n;for (int i = 0; i < n; i ++ ) cin >> a[i];int res = 0;for (int i = 0; i < n; i ++ )   // 枚举区间左端点{int minv = INF, maxv = -INF;for (int j = i; j < n; j ++ )   // 枚举区间右端点{minv = min(minv, a[j]);maxv = max(maxv, a[j]);if (maxv - minv == j - i) res ++ ;}}cout << res << endl;return 0;
      }

 最后再给大家用代数法模拟一下这个过程,最后一遍帮大家理解一下循环了,不会暴力的直接看这也可以理解了

题目的大致思路是:如果一个区间[a,b]中,max-min=b-a,那就说明这个区间没有不连续的数字,因为一个数字占一个坑位不允许有重复的数,所以只能说明没有连续的数字
代码在18行之前都是定义数字和读入数据的,这里面就是那个INF是很重要的,因为开头肯定要把a[j]读入所以,定义minv是个无限大的数,maxv反之。
好,开始代数了从枚举区间左端点开始代码第18行。eg:读入第一组数据 4        3 2 1 4 ,开始:i=0;minv=INF,maxv=-INF;j=i=0,minv=min(INF,a[j]),minv=a[j]=a[0]=3;
maxv=max(maxv,a[j]),maxv=a[j]=3;   maxv-minv=3-3==j-i=0-0;res++; j++; j=1,i=0; minv=min(minv(3),a[1]),minv=a[1]=2,   maxv=max(maxv(3),a[1]),maxv=3;
maxv-minv=3-2==j-i=1-0 ;res++;j++; j=2,i=0,minv=(2,a[2])minv=1;maxv=max(maxv,a[2])maxv=3;maxv-minv=3-1==j-i=2-0;res++; j++; 
j=3,i=0; minv=min(1,a[3])minv=1,maxv=max(3,a[3])maxv=a[3]=4; maxv-minv=4-1==j-i=3-0,res++; 返回i++; i=1
其实到这已经开始新的循环了,两轮循环也看清楚咋执行的了,这个题目重要的是思路,代数法就是验证的一个过程,对理解思路没啥好处,可以帮大家理解一下循环的过程。

我们下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HeyGen】让照片开口说话 —— 登录和使用:详细指南!

【HeyGen】让照片开口说话 关于HeyGen登录HeyGenStep1. 点击”免费开始使用“Step2. 账号注册Step3. 再次点击”Get Started“Step4. 常规个人信息调查Step5. 登录成功 使用HeyGenStep1. 上传Avatar&#xff08;头像&#xff09;Step2. 选定Avatar&#xff08;头像&#xff09;…

漏洞复现-泛微OA xmlrpcServlet接口任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

Java基础回顾——JDBC

文章目录 介绍使用JDBC事务JDBC BatchJDBC连接池 介绍 Java为关系数据库定义了一套标准的访问接口&#xff1a;JDBC&#xff08;Java Database Connectivity&#xff09; JDBC是Java程序访问数据库的标准接口 好处&#xff1a; 各数据库厂商使用相同的接口&#xff0c;Java…

【DevOps 工具链】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境&#xff08;以php7.0为例 &#xff09;3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

Java——基本数据类型

Java基本数据类型 一、 整型1. byte2. short3. int4. long 二、浮点型1. float2. double 三、 字符型(char)四、 布尔型&#xff08;boolean&#xff09; 总结 算下刚转Java到现在也有三个多月了&#xff0c;所以打算对Java的知识进行汇总一下&#xff0c;本篇文章介绍一下Java…

Vue实现响应式布局

前提准备&#xff1a;响应式布局有两种方法&#xff0c;看自己想要哪种。 方法一&#xff1a;百分比 用百分比去写元素的宽度&#xff0c;然后让子元素撑起父元素的高度 .parent {width: 50%; }.child {width:100%;height:100px; } 方法二&#xff1a;vh、vw vw、vh是基于视…

Git一个仓库包含多个不同的项目VUE(老项目的基础上,新建分支放新项目)

背景&#xff1a; 原有项目A&#xff08;vue2.6&#xff09;&#xff0c;需要在A的基础上接入组件库&#xff0c;涉及到项目升级&#xff0c;领导不想走这条路&#xff0c;建议重新构建一版2.7的项目B&#xff0c;那么现在就需要把项目B与项目A远程到同一个仓库&#xff1b; 解…

网络通信-Linux 对网络通信的实现

Linux 网络 IO 模型 同步和异步&#xff0c;阻塞和非阻塞 同步和异步 关注的是调用方是否主动获取结果 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回&#xff0c;而是通过其他手段比如&#xff0c;状态通知&#xff0…

TP-LINK AC1200 双频无线路由器网段设置

TP-LINK AC1200 双频无线路由器网段设置 1. 管理页面2. 上网设置3. 无线设置4. LAN 口设置 原始 3 网段5. LAN 口设置 设置 1 网段6. DHCP 服务器7. 重新连接References ​ 1. 管理页面 管理页面&#xff1a;http://tplogin.cn/ 上网方式&#xff1a;自动获得 IP 地址 2. 上网…

Vue框架引入Element-Ui

首先已经创建好了 Vue 框架&#xff0c;安装好了 node.js。 没有完成的可按照此博客搭建&#xff1a;搭建Vue项目 之后打开终端&#xff0c;使用命令。 1、命令引入 npm i element-ui -S2、package.json 查看版本 在 package.json 文件里可查看下载好的依赖版本。 3、在 ma…

Python入门学习篇(八)——元组详解

1 相关概念以及理解 1 python的元组与列表类似,不同之处在于元组的元素不可修改 2 有序且可重复 3 语法: (值1,值2,值3...值n) 最简单的元组为(值,) 而这个(值)并不是元组 4 关键字 tuple 5 因为元组不可修改,我们重新赋值元组的时候,只是改变了指向关系, 原来的元组还是依然…

【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一、概述 MyBatis简介 主要特性 1. 动态SQL 2.结果映射 3 .插件机制 二、MyBatis配置文件 1.配置文件结构 数据库连…

连锁电商管理系统门店拓客+门店进销存管理+门店进货+总部进销存管理 整体系统搭建设计

搭建一个连锁电商管理系统需要考虑门店拓客、门店进销存管理、门店进货以及总部进销存管理等多个方面。以下是一个整体系统功能整理&#xff1a; 1. **门店拓客** - 实现线上线下渠道的融合&#xff0c;建立一个门店拓客平台&#xff0c;吸引潜在客户。 - 设计会员管理系统&…

【算法题】11. 盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

tsconfig.app.json文件报红:Option ‘importsNotUsedAsValues‘ is deprecated...

在创建vue3 vite ts项目时的 tsconfig.json&#xff08;或者tsconfig.app.json&#xff09; 配置文件经常会报一个这样的错误&#xff1a; 爆红&#xff1a; Option ‘importsNotUsedAsValues’ is deprecated and will stop functioning in TypeScript 5.5. Specify compi…

Springboot实现定时任务

一、定时任务是什么&#xff1f; 定时执行任务&#xff0c;只有电脑不关机就可以在特定的时间去执行相应的代码&#xff0c;例如抢购脚本等 二、使用步骤 1.无需引入springboot自带 package com.ltx.blog_ltx;import org.springframework.boot.SpringApplication; import o…

低代码:拒绝重复、低价值的工单循环开发

一、前言 在软件开发和其他工程领域&#xff0c;“重复造轮子”被广泛认为是一种低效的做法&#xff0c;因为它浪费了大量的时间和资源去重新创作已经存在的东西&#xff0c;而不是利用现有的技术和经验去解决问题。 例如在大平台项目的实战开发中&#xff0c;针对不同业务场景…

docker-compose部署kafka

docker-compose.yml配置 version: "3" services:kafka:image: bitnami/kafka:latestports:- 7050:7050environment:- KAFKA_ENABLE_KRAFTyes- KAFKA_CFG_PROCESS_ROLESbroker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMESCONTROLLER- KAFKA_CFG_LISTENERSPLAIN…

63.乐理基础-打拍子-四十六

历史知识&#xff1a; 当前写的节奏型是四十六节奏型&#xff0c;同二八这个词的意思类似&#xff0c;四十六就是四个十六分音符组成的节奏型&#xff0c;所以简称四十六&#xff0c;以四分音符为一拍的时候&#xff0c;四个十六分音符加起来的总拍数就是一拍&#xff0c;这…

算法训练第四十八天|198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

198. 打家劫舍&#xff1a; 题目链接 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报…