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

news2024/12/28 19:10:09

前言:

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

正文:

题单: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){//遍历map
        temp+=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.coloradmin.cn/o/1835764.html

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

相关文章

6.18 作业

qt中用定时器实现闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTime>//时间类 #include<QTimer>//时间事件类 #include<QtTextToSpeech/QTextToSpeech>//文本转语音类QT_BEGIN_NAMESPACE namespace Ui { class Widge…

【Linux环境下Hadoop部署—Xshell6】解决“要继续使用此程序,您必须应用最新的更新或使用新版本。”

问题描述 打开xshell使用&#xff0c;弹出&#xff1a; 解决方案&#xff1a; 修改安装目录下面的 nsilense.dll 文件 用二进制编辑器&#xff08;notepad的HEX-Editor插件&#xff09;打开Xshell/Xftp安装目录下的 nslicense.dll。 HexEdit插件安装&#xff1a; 1.下载HexEdi…

leetcode21 合并两个有序单链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示例…

Java23种设计模式(二)

1、单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有…

MySQL日志——redolog

redo log&#xff08;重做日志&#xff09; 为什么需要redo log&#xff1f; 在mysql提交一个事务后&#xff0c;这个事务所作的数据修改并不会直接保存到磁盘文件中&#xff0c;而是先保存在buffer pool缓冲区中&#xff0c;在需要读取数据时&#xff0c;先从缓冲区中找&…

【MySQL进阶之路 | 高级篇】SQL执行过程

1. 客户端与服务器的连接 运行中的服务器程序与客户端程序本质上都是计算机的一个进程&#xff0c;所以客户端进程向服务器端进程发送请求并得到相应过程的本质就是一个进程间通信的过程. 我们可以使用TCP/IP网络通信协议&#xff0c;命名管道和共享内存等方式&#xff0c;实…

胡说八道(24.6.17)——STM32以及通信杂谈

之前的文章中咱们谈到了STM32的时钟&#xff0c;今天我们来联系实际&#xff0c;来看看内部时钟下和外部时钟下的两种不同时钟的电平翻转。本次终于有硬件了&#xff0c;是最基础的STM32F103C8T6。 首先是&#xff0c;内部时钟的配置操作。 系统的内部时钟是72MHz&#xff0c;由…

IPython 使用技巧整理

IPython 是一个强大的交互式 Python shell&#xff0c;广泛用于数据分析、科学计算和开发工作。本文将整理一些 IPython 的实用技巧&#xff0c;帮助你更高效地使用 IPython。 目录 快速启动和退出魔法命令高效的代码编写变量和对象信息历史命令IPython 扩展错误调试与 Jupy…

30v-180V降3.3V100mA恒压WT5107

30v-180V降3.3V100mA恒压WT5107 WT5107是一款恒压单片机供电芯片&#xff0c;它可以30V-180V直流电转换成稳定的3.3V直流电&#xff08;最大输出电流300mA&#xff09;&#xff0c;为各种单片机供电。WT5107的应用也非常广泛。它可以用于智能家居、LED照明、电子玩具等领域。比…

关于glibc-all-in-one下载libc2.35以上报错问题

./download libc版本 下载2.35时报错&#xff1a;原因是缺少解压工具zstd sudo apt-get install zstd 下载后重新输命令就可以了 附加xclibc命令 xclibc -x ./pwn ./libc-版本 ldd pwn文件 xclibc -c libc版本

rds2212控制台+license-server4.5版本控制台无法获取验证码的解决方案(by lqw)

这两个的控制台的日志信息报错如下&#xff1a; 原因&#xff1a; 使用的jdk不支持awt的字体 解决方案&#xff1a; 更换jdk&#xff0c;重新配置jdk环境变量&#xff0c;或者安装fontconfig组件 yum install -y fontconfig

逆向分析-Ollydbg动态跟踪Ransomware.exe恶意锁机程序

1.认识Ollydbg Ollydbg是一个新的动态追踪工具&#xff0c;将IDA与SoftICE结合起来的思想&#xff0c;Ring 3级调试器&#xff0c;非常容易上手&#xff0c;己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能&#xff0c;是目前最强大的调试工具。 Oll…

c语言指针经典笔试题

指针的笔试题目 //深度讨论数组名 int main1() {int a[] { 1,2,3,4 };printf("%d\n", sizeof(a)); //sizeof内部出现数组名代表是整个数组的大小 //16printf("%d\n", sizeof(a 0)); //首元素地址0还是首元素地址 4/8printf("%d\n", sizeof(*…

苹果手机618多次降价:京东618iPhone 15 Pro Max降价超2300元 销量重回销量榜第一

一年一度的618大促快接近尾声&#xff0c;在大促期间&#xff0c;iPhone 15多次降价后重回销量榜第一名。 买手机这个一定要领&#xff0c;你懂的&#xff01; &#xff08;20号结束 &#xff09; 淘宝APP搜&#xff1a;领到就赚3300 京东APP搜&#xff1a;好运红包588 如下…

leaflet室内地图\平面图点线面绘制

需求&#xff1a; 用户自定义上传一张平面图&#xff0c;然后可以在平面图内标点、绘制面、并且能够弹出相对应点、面的信息&#xff0c;信息可编辑&#xff0c;类似下图&#xff1a; 相关实现技术&#xff1a;leaflet 中文网&#xff1a;Leaflet - 一个交互式地图 JavaScript…

友思特应用 | 模型链接一应俱全:IC多类别视觉检测一站式解决方案

导读 高精度IC制造工艺需要对产品进行全方位检测以保证工艺质量过关。友思特 Neuro-T 通过调用平台的流程图功能&#xff0c;搭建多类深度学习模型&#xff0c;形成了一站式的视觉检测解决方案。本文将为您详述方案搭建过程与实际应用效果。 在当今集成电路&#xff08;IC&…

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

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

frp安装与配置

个人从网上杂乱的信息中学习、试错&#xff0c;记录自己成功配置的方法&#xff0c;避免遗忘 一、frp的下载 因目前无法下载&#xff0c;仅保留下载方法&#xff0c;版本号根据实际修改&#xff0c;目前使用0.54版&#xff0c;不同系统下载不同文件。 wget https://github.c…

[渗透测试学习] BoardLight-HackTheBox

BoardLight-HackTheBox 信息搜集 nmap扫描一下 nmap -sV -v 10.10.11.11扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu))80端口有h…

分享一个自己写的PC版的Ai指令保存工具

今天给大家分享下我用非常古老的VB写的一个小工具。纯粹是每次电脑使用指令太麻烦了&#xff0c;所以写了一个小工具。这个工具支持5条指令&#xff0c;作为一般的应该够用了。使用场景&#xff1a;比如你要经常使用指令&#xff0c;但是觉得复制指令麻烦&#xff0c;那么你可以…