蓝桥杯刷题冲刺 | 倒计时24天

news/2024/12/30 1:10:41/

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾

文章目录

  • 1.修剪灌木
  • 2.统计子矩阵

1.修剪灌木

  • 题目

    链接: 修剪灌木 - 蓝桥云课 (lanqiao.cn)

    找到一个蓝桥官网相比acwing刷题的优点:蓝桥官网可以看ac的占比

    爱丽丝要完成一项修剪灌木的工作。

    N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。

    灌木每天从早上到傍晩会长高 1 厘米, 而其余时间不会长高。在第一天的 早晨, 所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。

    输入格式

    一个正整数 N, 含义如题面所述。

    输出格式

    输出 N 行, 每行一个整数, 第 i 行表示从左到右第 i 棵树最高能长到多高。

    样例输入

    3
    

    样例输出

    4
    2
    4
    
  • 第一次

    #include<bits/stdc++.h>
    using namespace std;const int N=1e4+10;
    int a[N],m[N];int main()
    {int n;scanf("%d",&n);int k=pow(n,2)+2;while(k>0){for(int i=0;i<n;i++){for(int j=0;j<n;j++)  //每天长1{a[j]++;m[j]=max(m[j],a[j]);} a[i]=0;  //轮到的灌木,变0}for(int i=n-2;i>=1;i--)  //边界条件处理好{for(int j=0;j<n;j++){a[j]++;m[j]=max(m[j],a[j]);}a[i]=0;}k-=2;}for(int i=0;i<n;i++)printf("%d\n",m[i]);return 0;
    }
    

    简单暴力,只能 ac 30%

    我感觉 每次 所有数组元素+1,可以优化成差分

  • 第二次

    #include<bits/stdc++.h>
    using namespace std;int main()
    {int n;cin>>n;for(int i=1;i<=n;i++){cout<<max(n-i,i-1)*2<<endl; //找规律:当剪刀离灌木最远的时候,长的很高,然后返回马上要剪它的时候,最高,两倍高度;画图可知,到两个端点返回来的时候,最高}return 0;
    }
    

    在这里插入图片描述

  • 反思

    纯纯规律题,感觉错了

    发散性思维,在做蓝桥杯的时候,遇到这种 数 的题,先静下心来,找找规律

2.统计子矩阵

  • 题目

    链接: 4405. 统计子矩阵 - AcWing题库

    给定一个 N×M 的矩阵 A,请你统计有多少个子矩阵 (最小 1×1,最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 K?

    输入格式

    第一行包含三个整数 N,M 和 K。

    之后 N 行每行包含 M 个整数,代表矩阵 A。

    输出格式

    一个整数代表答案。

    数据范围

    对于 30% 的数据,N,M≤20,
    对于 70%的数据,N,M≤100,
    对于 100% 的数据,1≤N,M≤500;0≤Aij≤1000;1≤K≤2.5×10810^8108

    输入样例:

    3 4 10
    1 2 3 4
    5 6 7 8
    9 10 11 12
    

    输出样例:

    19
    

    样例解释

    满足条件的子矩阵一共有 19,包含:

    • 大小为 1×1 的有 10 个。
    • 大小为 1×2 的有 3 个。
    • 大小为 1×3 的有 2 个。
    • 大小为 1×4 的有 1 个。
    • 大小为 2×1 的有 3 个。
  • 第一次

    #include<bits/stdc++.h>
    using namespace std;const int N=510;
    int s[N][N];
    int n,m,k;int sum(int dx,int dy,int x,int y)
    {int res=0;res=s[x][y]-s[x-dx][y]-s[x][y-dy]+s[x-dx][y-dy];return res;
    }int main()
    {int cnt=0;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&s[i][j]);s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];  //前缀和}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){for(int l=1;l<=n;l++)  // l,r 表示 每个小矩阵,右下角的元素for(int r=1;r<=m;r++){if(sum(i,j,l,r)<=k) cnt++;}}cout<<cnt;return 0;
    }
    

    答案错误,样例都过不了,目前还没有找出来 bug

  • 正确题解 ->前缀和+双指针

    思路

    前缀和 把数组 存起来

    用 四个指针 把 整个矩阵 分成 一小块一小块的

    左右使用 i,j 指针,上下 使用 u,d 指针

    在这里插入图片描述

    #include<bits/stdc++.h>
    using namespace std;const int N=510;
    int s[N][N];
    int n,m,k;int main()
    {scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&s[i][j]);s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];}//i表示左边界,j表示右边界,u 表示上边界,d表示下边界long long ans=0;for(int i=1;i<=m;i++)for(int j=i;j<=m;j++){for(int u=1,d=1;d<=n;d++){while(u<=d&&s[d][j]-s[u-1][j]-s[d][i-1]+s[u-1][i-1]>k) u++; //u++ 表示上边界下移,区间变小,递减if(u<=d) ans+=d-u+1;  //表示这段区间的矩阵,满足条件}}cout<<ans;return 0;
    }
    
  • 反思

    及时复习前面的知识,忘光了

    遇到矩阵和,优先想到前缀和,然后,有区间的移动问题,使用双指针

    定义变量之前,先想清楚,它的数据类型和范围

Alt


http://www.ppmy.cn/news/32488.html

相关文章

震撼,支持多模态模型的ChatGPT 4.0发布了

最近几个月&#xff0c;互联网和科技圈几乎ChatGPT刷屏了&#xff0c;各种关于ChatGPT的概念和应用的帖子也是围绕在周围。当去年年底ChatGPT发布的那几天&#xff0c;ChatGPT确实震撼到了所有人&#xff0c;原来AI还可以这么玩&#xff0c;并且对国内的那些所谓的人工智能公司…

Kubernetes详细安装

By&#xff1a;雪月三十 参考&#xff1a; https://blog.csdn.net/qq_43580215/article/details/125153959 https://juejin.cn/post/6844903943051411469 https://mp.weixin.qq.com/s?__bizMzI0MDQ4MTM5NQ&mid2247502359&idx1&sn8c16100c9731359b9864403183f44233…

C语言/动态通讯录

本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时&#xff0c;可以…

哈佛与冯诺依曼结构

1. 下图是典型的冯诺依曼结构 2. CPU分为三部分&#xff1a;ALU运算单元&#xff0c;CU控制单元&#xff0c;寄存器组。 3. 分析51单片机为何能使用汇编进行编程 51指令集&#xff08;Instruction Set&#xff09;是单片机CPU能够执行的所有指令的集合。在编写51单片机程序时&a…

线程池的使用:如何写出高效的多线程程序?

目录1.线程池的使用2.编写高效的多线程程序Java提供了Executor框架来支持线程池的实现&#xff0c;通过Executor框架&#xff0c;可以快速地创建和管理线程池&#xff0c;从而更加方便地编写多线程程序。 1.线程池的使用 在使用线程池时&#xff0c;需要注意以下几点&#xff…

Spark SQL支持DataFrame操作的数据源

DataFrame提供统一接口加载和保存数据源中的数据&#xff0c;包括&#xff1a;结构化数据、Parquet文件、JSON文件、Hive表&#xff0c;以及通过JDBC连接外部数据源。一个DataFrame可以作为普通的RDD操作&#xff0c;也可以通过&#xff08;registerTempTable&#xff09;注册成…

【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证明(面试常问到)

文章目录前言环形链表环形链表 II写在最后前言 本章的OJ练习相对于OJ练习(4)较为简单。不过&#xff0c;本章的OJ最重要的是要我们证明为何可以这么做。这也是面试中常出现的。 对于OJ练习(4)&#xff1a;-> 传送门 <-&#xff0c;分割链表以一种类似于归并的思想解得&a…

数据库基础语法

sql&#xff08;Structured Query Language 结构化查询语言&#xff09; SQL语法 use DataTableName; 命令用于选择数据库。set names utf8; 命令用于设置使用的字符集。SELECT * FROM Websites; 读取数据表的信息。上面的表包含五条记录&#xff08;每一条对应一个网站信息&…