算法基础精选题单 枚举 (合适的枚举顺序+合适的枚举内容+前缀和和差分) (个人题解)

前言:

  今日第一份题解,题目主要是于枚举有关,枚举算是算法题中较为简单的部分了(对我来说还是有些难想的),话不多说,见下。

正文:

题单:237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com)

合适的枚举内容:

NC16593 [NOIP2011]铺地毯:

#include<bits/stdc++.h>
using namespace std;
int a[10000][4];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];}int x,y;cin>>x>>y;for(int i=n;i;i--){if(x>=a[i][0]&&x<=a[i][0]+a[i][2]&&y>=a[i][1]&&y<=a[i][1]+a[i][3]){cout<<i<<endl;return 0;}}cout<<-1<<endl;return 0;
}

   一开始像要开个数组模拟过程,但明显会超时,又想到查询只有一次,那么我们便可以从最后铺上的地毯开始向前枚举,如果按这个顺序枚举到了就一定是答案,如果到尾都没枚举到就是没地毯。

合适的枚举内容:

NC16438 回文日期:

#include<bits/stdc++.h>
using namespace std;
bool islunar(int y){return (y%4==0&&y%100!=0)||(y%400==0);
}
bool check(int year,int month,int day){if(month>12||month==0) return false;if(day>31) return false;if(month==2){if(islunar(year)&&day>29)return false;if(!islunar(year)&&day>28)return false;}if(month==4||month==6||month==9||month==11){if(day>30) return false;}return true;
}
int main()
{int x,y,i,ans=0;cin>>x>>y;int a,b,c,d,e,f,g,h;//8位数字int year,month,day;bool flag=false;for(i=x;i<=y;i++){year=i/10000;month=(i%10000)/100;day=i%100;a=i%10;b=(i/10)%10;c=(i/100)%10;d=(i/1000)%10;e=(i/10000)%10;f=(i/100000)%10;g=(i/1000000)%10;h=(i/10000000)%10;if(a==h&&b==g&&c==f&&d==e){if(check(year,month,day)){ans++;}}}cout<<ans<<endl;return 0;
}

模拟时间推进的过程,在枚举过程中判断回文并计数。

前缀和和差分:

NC16649 校门外的树+NC24636 值周:

#include<bits/stdc++.h>
using namespace std;
int a[100000005];
int main(){int l,m,ans=0;cin>>l>>m;for(int i=0;i<=m;i++){int x,y;cin>>x>>y;a[x]++;a[y+1]--;}for(int i=0;i<=l;i++){a[i]+=a[i-1];if(a[i]==0)ans++;}cout<<ans<<endl;return 0;
}

两个题题目大意相同,但数据范围不同,这边直接放上数据大的题,这题用差分可以很好写出来,只要找出差分数组的前缀和数组中值为0的个数就为答案。

 [CQOI2009]中位数图:

#include<bits/stdc++.h>
using namespace std;
int a[100005],l[100005],r[100005],aa[200005];
int n,b;
int main(){int res;cin>>n>>b;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]>b)a[i]=1;else if(a[i]==b)res=i;else a[i]=-1;}int sum=0,ans=1;for(int i=res-1;i>=1;i--){sum+=a[i];aa[n+sum]++;if(sum==0)ans++;//cout<<sum<<endl;}sum=0;for(int i=res+1;i<=n;i++){sum+=a[i];ans+=aa[n-sum];if(sum==0)ans++;//cout<<sum<<endl;}cout<<ans<<endl;return 0;
}

这题要求中位数为b的子序列,因为子序列个数为奇数,所以子序列中一定含有b,所以我们只用讨论包含b的子序列,不妨先确定b在子序列中,在分别向两边讨论,我们将大于b的数变为1,小于的变为-1,所以只要这段序列的和为0(不包含b)即为答案的一种情况。这边要讨论两种,一种是一边为0,一种是两边之和为0,最后求出的即为答案。

NC20032 激光炸弹:

#include<bits/stdc++.h>
using namespace std;
int a[5005][5005];
int main(){int n,r,ans=0;cin>>n>>r;for(int i=1;i<=n;i++){int x,y,v;cin>>x>>y>>v;a[x][y]+=v;//cout<<a[x][y]<<endl;}for(int i=0;i<=5000;i++){for(int j=0;j<=5000;j++){if(i==0&&j==0){a[i][j]=a[i][j];}else if(i==0)a[i][j]+=a[i][j-1];else if(j==0)a[i][j]+=a[i-1][j];else a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];//cout<<a[i][j]<<" ";if(i>=r-1&&j>=r-1){if(i==r-1&&j==r-1)ans=max(a[i][j],ans);else if(i==r-1)ans=max(a[i][j]-a[i][j-r],ans);else if(j==r-1)ans=max(a[i][j]-a[i-r][j],ans);else ans=max(a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r],ans);}}//cout<<endl;}cout<<ans;return 0;
}

通过二维前缀和来表示炸弹在该位置爆炸得到的价值,最后还原为爆炸范围大小的块来枚举答案,

NC207053 二分:

#include<bits/stdc++.h>
using namespace std;
map<int,int> a;
int inf=0x3f3f3f3f;
int main(){int n;cin>>n;for(int i=0; i<n; i++){int x;char op;cin>>x>>op;if(op=='.')a[x]++,a[x+1]--;if(op=='+')a[x]--,a[-inf]++;if(op=='-')a[x+1]++;}int temp=0,ans=0;for(auto it:a){//遍历maptemp+=it.second;//加上每个map对应的值ans=max(temp,ans);}cout<<ans<<endl;return 0;
}

这题和二分一点关系都没有,我们首先建立一个map来离散化的表示一个数组,数组的值表示该点满足的裁判所说话的数量,最后我们枚举map,最大的值就是裁判最多有多少个回答是正确的(因为该点可以满足这些情况)。最后数组我们就根据裁判的话来建立,如下

  1. 裁判说数大了,那么裁判说对的取值范围是(-∞,a]
  2. 裁判说数小了,那么裁判说对的取值范围是[a,+∞)
  3. 裁判说数一样,那么裁判说对的取值范围是[a,a]

最后得出答案。

NC50937 货仓选址:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main(){int n;cin>>n;for(int i=0;i<n;i++)cin>>a[i];sort(a,a+n);int ans=0,l=0,r=n-1;while(l<r) ans+=a[r--]-a[l++];cout<<ans;return 0;
}

将位置排序后知把货仓放在数组中间是正确的选择,如果为奇数则中间那个距离为0,剩下的两两配对(最小的和最大的,第二小的和第二大的)。最后易得答案。

后记:

   这些题难度还算可以,不过我看后面题难度在慢慢加大。

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

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

相关文章

概念描述——TCP/IP模型中的两个重要分界线

TCP/IP模型中的两个重要分界线 协议的层次概念包含了两个也许不太明显的分界线&#xff0c;一个是协议地址分界线&#xff0c;区分出高层与低层寻址操作&#xff1b;另一个是操作系统分界线&#xff0c;它把系统与应用程序区分开来。 高层协议地址界限 当我们看到TCP/P软件的…

Eigen中 Row-Major 和 Column-Major 存储顺序的区别

Eigen中 Row-Major 和 Column-Major 存储顺序的区别 flyfish Eigen::RowMajor 是 Eigen 库中用于指定矩阵存储顺序的一种选项 理解 Row-Major 和 Column-Major 存储顺序的区别&#xff0c;绘制一个单一的图来显示内存中的元素访问顺序,在图中用箭头表示访问顺序. import nu…

BarTender软件最新版下载-bartender条码标签打印软件下载

​​BarTender​​是一款遵循“look and feel”标准的​​条码打印​​软件。​​BarTender​​条码打印软件能够帮助用户挥洒自如&#xff0c;轻松制作出标签条码&#xff0c;包括文本、图形、​​条形码​​和大多数序列化功能。BarTender条码打印软件功能强大、操作简单&…

以太坊智能合约不能调用:一定注意智能合约地址,每次部署地址都会变化;nonce值 什么作用,是什么;在交易中调用智能合约添加附加信息

目录 以太坊智能合约不能调用 一定注意智能合约地址,每次部署地址都会变化 Transaction must include these fields: %r" % missing_keys 缺少nonce nonce值 什么作用,是什么 在交易中调用智能合约添加附加信息 1. 定义智能合约 2. 部署并调用智能合约 注意事项…

基于YOLOv10深度学习的高密度人脸智能检测与统计系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

C++之STL(一)

1、泛型程序设计 目的&#xff1a;提供相同的算法&#xff0c;相同的逻辑&#xff0c;来对不同类型的数据结构进行操作。 所以需要将类型当作参数&#xff0c;也就是参数类型化。 2、什么是STL STL是基于模板实现的。编译的时候进行实例化 3、STL组件 4、容器算法迭代器关系 …

使用 Hugging Face 推理终端搭建强大的“语音识别 + 说话人分割 + 投机解码”工作流

Whisper 是当前最先进的开源语音识别模型之一&#xff0c;毫无疑问&#xff0c;也是应用最广泛的模型。如果你想部署 Whisper 模型&#xff0c;Hugging Face推理终端能够让你开箱即用地轻松部署任何 Whisper 模型。但是&#xff0c;如果你还想叠加其它功能&#xff0c;如用于分…

项目实战中学透Spring-业务场景驱动-Spring01(IOCDI)

软件环境 JDK1.8 Maven3.6 IDEA2022.3(Ultimate Edition) Spring5.3.29 主要知识点大纲 1.Spring简介 2.Spring整体架构 3.业务场景中理解Spring IOC(控制反转)和DI(依赖注入) 4.业务场景中理解IOC容器&#xff0c;实例化容器&#xff0c;实例化Bean的几种方式 5.业务…

[面试题]Redis

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis 什么是 Redis &#xff…

随机产生一些江河上的坐标数据

不久前收到一个需求&#xff0c;说要随机创建约一百个某段江河上的坐标点&#xff0c;用于做一些数据呈现。 我首先是想到用AI直接给我一点数据&#xff0c;没想到给出来的坐标&#xff0c;有许多都落在陆地上&#xff0c;根本不符合我的要求。后来结合AI给出的建议&#xff0…

生成对抗网络——GAN深度卷积实现(代码+理解)

本篇博客为 上篇博客的 另一个实现版本&#xff0c;训练流程相同&#xff0c;所以只实现代码&#xff0c;感兴趣可以跳转看一下。 生成对抗网络—GAN&#xff08;代码理解&#xff09; http://t.csdnimg.cn/HDfLOhttp://t.csdnimg.cn/HDfLO 目录 一、GAN深度卷积实现 1. 模型…

The First项目报告:深度解读Layer 2生态zkSync

zkSync发币了&#xff0c;这个无数撸毛党心心念念数年之久的项目终于要来了&#xff0c;zkSync 是由Matter Labs 于2019 年推出的以太坊Layer 2 扩容解决方案&#xff0c;作为L2龙头项目之一&#xff0c;与其同属一个层次的L2四大天王之三Optimism、Arbitrum、zkSync、StarkNet…

Profibus协议转Modbus协议网关模块帮助PLC实现智能激光设备通讯

一、前言 Profibus转Modbus网关&#xff08;XD-MDPB100&#xff09;是一种工业通信协议转换设备&#xff0c;用于实现Profibus协议与Modbus协议之间的转换。Profibus转Modbus网关在工业自动化系统中具有广泛的应用&#xff0c;它解决了不同协议设备之间的通信问题。本文将深入…

怎么样判断真假单北斗

国产化替代正在中国各行各业逐步提升中&#xff0c;特别涉及重点产业——国家安全&#xff01; 只有仅支持B1I和B3信号的芯片才是真正的单北斗芯片。但凡你支持了B1C、B2a、B2b中的一个就是假的单北斗。 B1C/L1/E1、B2a/ L5/E5a、B2b/G3/E5b这些频点与其他GNSS系统是完全重合的…

湖北科技学院2024年成人高等继续教育招生简章

湖北科技学院&#xff0c;这所坐落在荆楚大地的高等学府&#xff0c;一直以来都是培养各类专业人才的重要基地。随着社会的快速发展&#xff0c;终身学习的理念深入人心&#xff0c;成人高等继续教育作为满足广大成年人提升学历、增强职业技能的重要途径&#xff0c;受到了越来…

Java输入输出语句 和 保留字

目录 键盘输入语句 保留字 键盘输入语句 Input.java , 需要一个 扫描器(对象), 就是Scanner 步骤 &#xff1a; 导入该类的所在包, java.util.*创建该类对象&#xff08;声明变量&#xff09;调用里面的功能 案例要求&#xff1a;可以从控制台接收用户信息&#xff0c;【姓…

润滑不良:滚珠花键磨损的隐形杀手!

滚珠花键作为一种精密机械传动元件&#xff0c;被广泛应用于各种机器和设备中&#xff0c;起着传递动力和运动的重要作用。滚珠花键经过长时间的运行&#xff0c;难免会多少些磨损&#xff0c;严重的话还会导致设备不能正常运转。那么&#xff0c;如何保证它的正常运行呢&#…

88. 合并两个有序数组(简单)

88. 合并两个有序数组 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;88. 合并两个有序数组 2.详细题解 两个数组均有序&#xff08;非递减&#xff09;&#xff0c;要求合并两个数组&#xff0c;直观的思路&#xff0c;借助第三个数…

【Linux环境下Hadoop部署】—报错“Unit ntpd.service could not be found.“

项目场景&#xff1a; 执行 “systemctl status ntpd” 命令。 问题描述 报错&#xff1a;Unit ntpd.service could not be found. 原因分析&#xff1a; 没有安装ntp 解决方案&#xff1a; 执行 “yum install ntp” 命令&#xff0c;再次执行 “systemctl status ntpd” 命令…

Docker部署私有仓库Harbor

Harbor构建Docker私有仓库 文章目录 Harbor构建Docker私有仓库资源列表一、部署Docker-Compose服务1.1、下载最新Docker-Compose1.2、查看Docker-Compose版本 二、部署Harbor服务2.1、下载Harbor安装程序2.2、配置Harbor参数文件2.3、所需参数和可选参数2.3.1、所需参数2.3.2、…