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

前言:

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

正文:

题单: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软件的…

el-radio单选框的选中与取消

需求是有一个单选框&#xff0c;点击选中&#xff0c;再次点击取消。 第一次写的时候代码如下&#xff1a; <el-radio-group v-model"keyForm.highlight"><el-radio:value"true"click"handleClick">是</el-radio> </el-r…

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

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

Python基础学习笔记(十一)——集合

目录 一、集合的介绍与创建二、集合的存储原理三、元素的修改1. 添加元素2. 删除元素 四、集合的运算五、集合的判定 一、集合的介绍与创建 集合&#xff08;set&#xff09;&#xff0c;一种可变、无序、不重复的数据结构&#xff0c;由大括号{}内、用逗号分隔的一组元素组成。…

Redis面试题自测

文章目录 一、Redis 有什么作用?为什么要用 Redis为什么要用缓存&#xff1f;二、Redis 除了做缓存&#xff0c;还能做什么&#xff1f;三、Redis 可以做消息队列么&#xff1f;四、分布式缓存常⻅的技术选型⽅案有哪些&#xff1f;五、Redis 常⽤的数据结构有哪些&#xff1f…

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、容器算法迭代器关系 …

Flink 计数器Accumulator

简述 在 Apache Flink 中&#xff0c;Accumulator 是一个用于收集作业执行期间聚合信息的工具。它允许在用户定义的函数&#xff08;如 MapFunction, FlatMapFunction, ProcessFunction 等&#xff09;中累积值&#xff0c;并在作业完成后检索这些值。这对于跟踪诸如事件数量、…

使用 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.业务…

java基础·小白入门(一)

目录 Java语言概述Java的性质三种平台跨平台原理 Java语言开发环境相关概念Java开发工具的安装Java程序的编译与运行基本注意事项 Java语言基础数据类型基本数据类型引用数据类型 关键字与标识符常量与变量常量变量 数据类型转换常见运算符 Java语言概述 这一部分主要讲讲Java的…

Chrome扩展程序开发新手指南:事件监听器的应用技巧

问题背景 最近我在开发Chrome浏览器插件时&#xff0c;遇到了一个需要脚本初始化的问题。在插件被安装后或浏览器标签页被刷新时&#xff0c;我需要重新初始化插件。为了实现这一点&#xff0c;我研究了Chrome提供的几个API接口&#xff0c;它们分别是chrome.runtime.onInstal…

[面试题]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. 模型…

面试题分享--Spring02

Spring 框架中都用到了哪些设计模式?(必会) 1. 工厂模式&#xff1a;BeanFactory 就是简单工厂模式的体现&#xff0c;用来创建对象的实例 2. 单例模式&#xff1a;Bean 默认为单例模式 3. 代理模式&#xff1a;Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成…

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;它解决了不同协议设备之间的通信问题。本文将深入…