枚举(蓝桥杯备赛系列)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
其实到这已经开始新的循环了,两轮循环也看清楚咋执行的了,这个题目重要的是思路,代数法就是验证的一个过程,对理解思路没啥好处,可以帮大家理解一下循环的过程。

我们下期见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity6 | 退出登录后的跳转

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 登录失败后的JSON处理 📚个人知识库: Leo知识库,…

联想发布天禧AI生态四端一体战略,聚焦智能体小程序开发

12月26日&#xff0c;2023联想天禧AI生态伙伴大会在北京正式召开&#xff0c;联想与英特尔、百度、网易有道等头部企业、400余家行业开发者和媒体齐聚一堂&#xff0c;以“AI生态 共赢未来”为主题&#xff0c;共同探讨未来AI生态发展及应用。联想集团副总裁、中国区消费业务群…

如何优化SEO的网站架构

通过优先考虑网站架构来提升你的SEO游戏–这是经常被忽视的有机性能的动力源。了解为什么清晰的结构至关重要&#xff0c;并获得对 SEO 友好的网站的提示。 当人们谈论高优先级的SEO活动时&#xff0c;他们通常会指出关键词研究、内容规划和链接建设等关键领域。 网站架构很少…

Text to image论文精读 TISE (Text-to-Image Synthesis Evaluation):用于文本到图像合成的评估度量工具包

TISE (Text-to-Image Synthesis Evaluation)是一款用于评估文本生成图像的Python评估工具箱。文章由Tan M. Dinh, Rang Nguyen, and Binh-Son Hua等人发表。 其以统一的方式促进、倡导公平的评估度量&#xff0c;并为未来的文本到图像综合研究提供可重复的结果。 文章链接&am…

医院手术麻醉系统源码,基于PHP、 js 、mysql、laravel、vue2技术开发,实现患者数据的自动采集和医疗文书自动生成

手麻系统作为医院信息化系统的一环&#xff0c;由监护设备数据采集系统和麻醉信息管理系统两个子部分组成。手麻信息系统覆盖了患者术前、术中、术后的手术过程&#xff0c;可以实现麻醉信息的电子化和手术麻醉全过程动态跟踪。 以服务围术期临床业务工作的开展为核心&#xf…

Android Studio问题解决:java.lang.NoSuchMethodException

文章目录 一、遇到问题二、分析与思考三、解决问题 一、遇到问题 java.lang.NoSuchMethodException: com.zkteco.android.biometric.b.a.ajni方法调用不到 二、分析与思考 新建了一个最简单的demo发现问题依旧 三、解决问题 通过交叉对比&#xff0c;最后发现是minifyEnable…

数据结构思维导图

数据结构思维导图&#xff0c;目前先写这些&#xff0c;后续有更新会继续。 1 数据结构思维导图

redis 从0到1完整学习 (七):ZipList 数据结构

文章目录 1. 引言2. redis 源码下载3. zipList 数据结构3.1 整体3.2 entry 数据结构分析3.3 连锁更新 4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&am…

让马达转动起来(motor)

代码&#xff1a; #include "reg51.h"sbit P2_0 P2^0; sbit P2_7 P2^7;void main(){while(1){P2_0 1;P2_7 0;} } 仿真&#xff1a; 介绍&#xff1a; 当2.0和2.7端口均为低电平或高电平时&#xff0c;马达保持不转动&#xff1b; 当2.0和2.7端口分别为高电平和…

数据库开发之内连接和外连接的详细解析

1.2 内连接 内连接查询&#xff1a;查询两表或多表中交集部分数据。 内连接从语法上可以分为&#xff1a; 隐式内连接 显式内连接 隐式内连接语法&#xff1a; select 字段列表 from 表1 , 表2 where 条件 ... ; 显式内连接语法&#xff1a; select 字段列表 …

ElasticSearch之RestClient笔记

1. ElasticSearch 1.1 倒排索引 1.2 ElasticSearch和Mysql对比 1.3 RestClient操作 导入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.15.…

带大家做一个,易上手的家常辣椒炒香肠

搞两根香肠 我这里选择的哈尔滨红肠 切成片 打开下图这么大块姜 三瓣蒜 姜蒜切小片 三分之一个大葱 切段 一个螺丝椒 螺丝椒切片 起锅烧油 下葱姜蒜翻炒 翻炒一会儿 然后下入螺丝椒 翻炒出辣椒的辣味后 倒入一勺生抽调味 翻炒均匀后下入香肠 翻炒个几分钟 就可以放入…

Github项目推荐:快写鸭

项目地址 GitHub - oncework/kuaixieya: 「快写鸭」是一款专为开发者开发的一站式写作、管理、发布的更简单且下载即用的效率工具&#xff0c;去除繁琐配置但又极具丰富且自定义性质等功能。 项目简介 这是一个多平台的内容分发工具。可以用来加快博文的多平台发布。 项目截…

jar 运行清单文件MANIFEST.MF生成定义Main-Class Premain-Class IDEA maven-assembly-plugin

可运行jar文件中的启动清单文件 META-INF/MANIFEST.MF 内容自定义生成 清单文件中的 Main-Class: Premain-Class: Can-Retransform-Classes: 在maven-assembly-plugin插件中的生成配置如下, 注意命名 <archive> <manifest> <mainClass>c…

记一次接口交互is开头的属性序列化后“is”丢失问题

问题背景&#xff1a; 今天在做项目联调时调用别人的第三方接口时&#xff0c;发现字段传递不对导致参数传递异常的问题&#xff0c;当时还很奇怪&#xff0c;明白传好着呢&#xff0c;怎么就好端端的出现字段不对的情况呢&#xff1f; 查看发现该字段为boolean类型的isIsRef…

龙蜥开源操作系统能解决CentOS 停服造成的空缺吗?

龙蜥开源操作系统能解决CentOS 停服造成的空缺吗&#xff1f; 本文图片来源于龙蜥&#xff0c;仅做介绍时引用用途&#xff0c;版权归属龙蜥和相关设计人员。 一、《国产服务器操作系统发展报告&#xff08;2023&#xff09;》称操作系统已步入 2.0 时代&#xff0c;服务器操作…

【C语言刷题每日一题】一维数组的交换

目录 问题描述 思路分析 代码实现 结果测试 问题描述 将两个整型一维数组的元素进行交换 如果两个数组长度相同就全部交换&#xff1b; 如果两个数组长度不同&#xff0c;则交换长度相同部分的元素 思路分析 为了代码的复用&#xff0c;这里通过函数来实现&#xff0c;…

【QML-对话框】

QML编程指南 VX&#xff1a;hao541022348 弹出类DialogDrawerFileDialog文件对话框 &#x1f3b3;FontDialog字体对话框 &#x1f6b4;ColorDialog 颜色对话框 &#x1f3ca;MessageDialog 消息提示框 &#x1f429; 弹出类 Dialog 对话框是一种弹出式对话框&#xff0c;主要…

4.13 构建onnx结构模型-Conv

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Conv 结点进行分析 方式 方法一…

蓝桥杯的学习规划

c语言基础&#xff1a; Python语言基础 学习路径&#xff1a;画框的要着重学习