Peter算法小课堂—枚举优化

news2025/1/19 2:39:29

哈哈哈,新年快乐!这一次Peter将要给大家讲一讲轻松、摆烂的算法—枚举!咋就是说呀,枚举这个玩意我语法就会了。但大家想想,咱们CSP考试时(除了没过初赛的)只给1秒,大家想想,这出题老师得有多抠啊。大伙们信不信,就这种easy的题,都配出进普及组,不管大家信不信,例题给我搬上来

[NOIP2016 普及组] 回文日期

题目描述

在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。

牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8 位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。

一个 8 位数字是回文的,当且仅当对于所有的 i(1≤i≤8)从左向右数的第 i 个数字和第 9−i 个数字(即从右向左数的第 i 个数字)是相同的。

例如:

  • 对于 2016 年 11 月 19 日,用 88 位数字 20161119 表示,它不是回文的。
  • 对于 2010 年 1 月 2 日,用 88 位数字 20100102 表示,它是回文的。
  • 对于 2010 年 10 月 2 日,用 88 位数字 20101002 表示,它不是回文的。

每一年中都有 12 个月份:

其中,1,3,5,7,8,10,12 月每个月有 31 天;4,6,9,11 月每个月有 30 天;而对于 2 月,闰年时有 29 天,平年时有 28 天。

一个年份是闰年当且仅当它满足下列两种情况其中的一种:

  1. 这个年份是 4 的整数倍,但不是 100 的整数倍;
  2. 这个年份是 400 的整数倍。

例如:

  • 以下几个年份都是闰年:2000,2012,2016。
  • 以下几个年份是平年:1900,2011,2014。

 大家看道题给大家做个不用脑子的选择吧

当然,选B的人一定有那么一点点的**。这个选择题应该选 B D。

啊这,请大家 写一写代码 注意:看到这题千万别崩溃

先学两个语法吧,啥?语法?我学过了啊?

语法1

#include <bits/stdc++.h>
using namespace std;
int main(){
	string year="2019";
	reverse(year.begin(),year.end());
	cout<<year<<endl;
	int x[3]={7,8,9};
	reverse(x,x+3);
	cout<<x[0]<<x[1]<<x[2]<<endl;
	return 0;
}

仔细观察此代码,有什么难以理解的地方。这叫“序列反转”。大家自己玩玩试试。当然,CSP时尽量多使用一些系统封装好的的函数,以免这个傻了吧唧调试几次没成功的,WA满天飞。

语法2

#include <bits/stdc++.h>
using namespace std;
void I2S(int x,string&str){
	stringstream ss;
	if(x<=9) ss<<0;
	ss<<x;ss>>str; 
}
int main(){
	string s;
	I2S(1,s);
	cout<<s<<endl;
	I2S(12,s);
	cout<<s<<endl;
	return 0;
}

这个属于int转string。来,看看&是什么,是引用传递!传递什么,传递地址啊,这可以让这个庞大的字符串变成轻量级的地址。

开始写代码八!

过亿会儿公布答案。

噔噔噔噔,公布答案啦

#include <bits/stdc++.h>
using namespace std;
void I2S(int x,string&str){
	stringstream ss;
	if(x<=9) ss>>0;
	ss<<x;s>>str; 
}
int nDays[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
	string date1,date2;
	cin>>date1>>date2;
	int ans=0;
	for(int m=1;m<=12;m++){
		string month;
		I2S(m,month);
		for(int d=1;d<=nDays[m];d++){
			string day;
			I2S(d,day);
			string md=month+day;
			string year=md;
			reverse(year.begin(),year.end());
			string date=year+md;
			if(date>date1&&date<=date2) ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

 [NOIP2008 提高组] 火柴棒等式

题目描述

给你 n 根火柴棍,你可以拼出多少个形如 A+B=C 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 0∼9 的拼法如图所示:

注意:

  1. 加号与等号各自需要两根火柴棍;
  2. 如果 A≠B,则 A+B=C 与 B+A=C 视为不同的等式(A,B,C≥0);
  3. n 根火柴棍必须全部用上。

提高组2008年第2题?考枚举?不可思议啊?那么学完例一过后,大家是不是有了亿点思路了呢?所以……请大家写写代码八!!!

预处理1

match[]数组表示单个数字i需要用几个火柴,i=0,1,2,3,4,5,6,7,8,9

所以请大家计算一下match[]数组的值。

答案是:

当然,摆的数不一定是个位数,还有可能是两位数、三位数……。于是,这个预处理还不够。

预处理2

然后,请大家打开DEV-C++,写一下matches()函数,它的功能是“给定一个整数x,x=0~999,求组成x要多少火柴”。过亿会儿公布答案。

void matches(){
	for(int x=0;x<N;x++){
		int y=x;
		do{
			cnt[x]+=match[y%10];
			y/=10;
		}while(y);
	}
}

注意:x从0开始,要用do……while

枚举

OK!那么现在,大家想想怎么枚举的呢?我给大家一个原稿,大家试着优化一下。优化方面:1.枚举对象 2.枚举范围 3.枚举顺序

int ans=0;
for(int A=0;A<=1000;++A){
	for(int B=0;B<=1000;++B){
		for(int C=0;C<=1000;++C){
			if(A+B==C&&cnt[A]+cnt[B]+cnt[C]+4==n){
				ans++;
			}
		}
	}
}
cout<<ans<<endl;

代码写完网上一交,唉,还真AC(All Clear)了,挺神奇的哈,这个某谷

但你想想,但凡出题老师吝啬一点,我们这代码不管什么数据,都是0分,俗称爆0。为什么呢?因为你怎么变这个数据,代码都是运行10^9次,也就是1亿次。

后面我们分两种方法详细的给大家讲讲如何优化

打表

咱们发现那,n<=24,一共就只有24种情况,咱不妨……打个表试试?所以可以提前打表,最终提交表格。有人问到,我们这表格咋填嘞。这个本地运行时间充裕,保证正确。这个办法大家尝试尝试。

减少枚举对象

对象?

啊这……其实,我们只要枚举A,B,算出C,再判断即可,所以……满满分代码来啦。

#include <bits/stdc++.h>
using namespace std;
int match[10]={6,2,5,5,4,5,6,3,7,6};
const int N=999;
int n,cnt[N];
void matches(){
	for(int x=0;x<N;x++){
		int y=x;
		do{
			cnt[x]+=match[y%10];
			y/=10;
		}while(y);
	}
}
int main(){
	cin>>n;
	matches();
	int ans=0;
	for(int A=0;A<=1000;A++){
		for(int B=0;B<=1000;B++){
			int C=A+B;
			if(cnt[A]+cnt[B]+cnt[C]+4==n){
				ans++;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

来,又又又完成一题,再来一题。

啊啊啊啊

股神

题目描述

作为股神,你的神力是能看到未来n天里每天股票的盈利或者亏损,第i天盈利x[i]元,当然如果x[i]是负数,代表亏损。一次投资可以发生在任意连续天。为了不让人发现你的神力,你必须挑选两段不重叠也不连续的投资,来掩人耳目。请计算你最多盈利多少?

这叫做“两段最大子段和问题”。考虑两个算法,①枚举4个端点 ②枚举分割点

第1中算法时间复杂度O(N^4),大家嚼的可能吗?可能。那么,我们要左右预计算了。这样吧,这道题就当作小练习,码量不多,就20多行,不要抄答案哦👍

发一个表情包分割答案

#include <bits/stdc++.h>
using namespace std;
const int N=200009;
int n,LR[N],L[N],R[N],x[N],f[N],g[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>x[i];
	for(int i=1;i<=n;i++)
		f[i]=max(f[i-1],0)+x[i];
	L[1]=f[1];//L[]表示在1到i号的最大子段和,f[]表示以i号结尾的最大子段和 
	for(int i=2;i<=n;i++)
		L[i]=max(L[i-1],f[i]);
	for(int i=n;i>=1;i--)
		g[i]=max(g[i+1],0)+x[i];
	R[n]=g[n];
	for(int i=n-1;i>=1;i--)
		R[i]=max(R[i+1],g[i]);
	for(int i=2;i<=n-1;i++)
		LR[i]=L[i-1]+R[i+1];
	cout<<*max_element(LR+2,LR+n)<<endl;
	return 0;
}

这题需要亿点动态规划的知识,不会的翻我主页就好了。

好了,到这里就结束了,给大家送句祝福:新年伊始,万象更新。愿所念之人,平安喜乐;愿所想之事,顺心如意。诶,大家看春晚了不?

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

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

相关文章

跟着cherno手搓游戏引擎【23】项目维护、2D引擎之前的一些准备

项目维护&#xff1a; 修改文件结构&#xff1a; 头文件自己改改就好了 创建2DRendererLayer&#xff1a; Sandbox2D.h: #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void O…

【lesson46】进程通信之system V(共享内存)

文章目录 共享内存通信原理用共享内存通信shmServer.ccshmClient.cc 完整通信代码common.hppLog.hppshmServer.ccshmClient.cc通信测试 共享内存借助管道添加访问控制common.hppshmServer.ccshmClient.cc 共享内存通信原理 两个进程将一块system V的物理地址通过页表映射到自己…

JSP编程

JSP编程 您需要理解在JSP API的类和接口中定义的用于创建JSP应用程序的各种方法的用法。此外,还要了解各种JSP组件,如在前一部分中学习的JSP动作、JSP指令及JSP脚本。JSP API中定义的类提供了可借助隐式对象通过JSP页面访问的方法。 1. JSP API的类 JSP API是一个可用于创建…

大模型学习 一

https://www.bilibili.com/video/BV1Kz4y1x7AK/?spm_id_from333.337.search-card.all.click GPU 计算单元多 并行计算能力强 指数更重要 A100 80G V100 A100 海外 100元/时 单卡 多卡并行&#xff1a; 单机多卡 模型并行 有资源的浪费 反向传播 反向传播&#xff08;B…

第6章 智能租房——前期准备

学习目标 了解智能租房项目&#xff0c;能够说出项目中各模块包含的功能 熟悉智能租房项目的开发模式与运行机制&#xff0c;能够复述项目的开发模式与运行机制 掌握智能租房项目的创建&#xff0c;能够独立创建智能租房项目 掌握智能租房项目的配置&#xff0c;能够为智能租…

教师考试,搜题软件哪个好用?大学生必备工具:搜题软件推荐 #微信#学习方法

在大学生的学习过程中&#xff0c;我们经常会遇到各种难题和疑惑。有时候&#xff0c;我们可能会花费大量的时间和精力去寻找答案&#xff0c;但结果却并不尽如人意。为了帮助大家更好地解决这个问题&#xff0c;今天我要向大家介绍几款备受大学生欢迎的搜题软件&#xff0c;它…

【NICN】探索牛客之求阶乘

1.题目描述 递归和非递归分别实现求n的阶乘&#xff08;不考虑溢出的问题&#xff09; 2.代码解题 2.1递归 递归思想&#xff1a; Fac(N) 1*2*3*……*N递归方式实现&#xff1a;1 N < 1 Fac(N)Fac(N-1)*N N > 2 long long Fac(int N) {if(N < 1)return 1;retu…

欢度春节,祝福万家。

值此春节佳节来临之际,新年问候如一道灯光&#xff0c;照亮我们前行的路。在这光芒中&#xff0c;期待与你携手走过新的一年。 春节是中华民族最重要的传统节日,它代表着新的开始和希望。在这个特殊的时刻,让我们放下过去的烦恼和忧虑,迎接新的挑战和机遇。让我们珍惜和家人团…

使用 Elasticsearch 和 OpenAI 构建生成式 AI 应用程序

本笔记本演示了如何&#xff1a; 将 OpenAI Wikipedia 向量数据集索引到 Elasticsearch 中使用 Streamlit 构建一个简单的 Gen AI 应用程序&#xff0c;该应用程序使用 Elasticsearch 检索上下文并使用 OpenAI 制定答案 安装 安装 Elasticsearch 及 Kibana 如果你还没有安装好…

Android性能调优 - 应用安全问题

Android应用安全 1.组件暴露&#xff1a; 像比如ContentProvider,BroadcastReceiver&#xff0c;Activity等组件有android:exported属性&#xff1b; 如果是私有组件 android:exported “false”&#xff1b; 如果是公有组件 android:exported “true” 且进行权限控制&…

Linux 存储管理(磁盘管理、逻辑卷LVM、交换分区swap)

目录 1.磁盘管理 1.1 磁盘简介 1.2 管理磁盘 添加磁盘 管理磁盘流程三步曲 1.查看磁盘信息 2.创建分区 3.创建文件系统 4.挂载mount 5.查看挂载信息 6.MBR扩展分区 7.重启后的影响 2.逻辑卷LVM 2.1 简介 ​​​​​​2.2 创建LVM 2.3 VG管理 2.4 LV管理实战-在…

单片机学习笔记---DS1302实时时钟工作原理

目录 DS1302介绍 学会读芯片手册&#xff08;DS1302芯片手册&#xff09; 封装 引脚定义 电源部分 时钟部分 通信部分 总结列表 内部结构图 电源控制部分 时钟控制部分 寄存器部分 访问部分 寄存器部分的详细定义 命令字 时序的定义 单字节读 单字节写 提前预…

qt/c++实现拓扑排序可视化

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 实现功能 1、选择文件导入初始数据 2、逐步演示 3、排序完成输出…

L1-096 谁管谁叫爹

一、题目 二、解题思路 依据题意判断即可。 三、代码 #include<iostream> using namespace std; #include<cmath> int main() {int n;cin>>n;while(n--){int n1,n2,s10,s20;cin>>n1>>n2;for(int i1;n1/i>0;i*10){s1(n1/i%10);}for(int i1;n…

FastDFS安装并整合Openresty

FastDFS安装 一、环境--centos7二、FastDFS--tracker安装2.1.下载2.2.FastDFS安装环境2.3.安装FastDFS依赖libevent库2.4.安装libfastcommon2.5.安装 libserverframe 网络框架2.6.tracker编译安装2.7.文件安装位置介绍2.8.错误处理2.9.配置FastDFS跟踪器(Tracker)2.10.启动2.11…

【JAVA WEB】 css背景属性 圆角矩形的绘制

目录 背景属性设置 圆角矩形 背景属性设置 背景颜色,在style中 background-color:颜色&#xff1b; 背景图片 background-image:url(……) 背景图片的平铺方式 background-repeat: 平铺方式 repeat 平铺&#xff08;默认&#xff09;no-repeat 不平铺repeat-x 水平平铺repea…

设计模式3-责任链模式

责任链模式是一种行为设计模式&#xff0c;它允许你创建一个对象链。请求沿着这条链传递&#xff0c;直到有一个对象处理它为止。这种模式通常用于需要以某种方式动态地决定处理请求的顺序或方式的情况。 类图&#xff1a; 从图中可见最大的特点是AbstractHandler它自己聚合了自…

探索Xposed框架:个性定制你的Android体验

探索Xposed框架&#xff1a;个性定制你的Android体验 1. 引言 在当今移动设备市场中&#xff0c;Android系统作为最受欢迎的操作系统之一&#xff0c;其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制&#xff0c;以获得更符合自己习惯的使用…

svg 进阶

svg 进阶 svg 应用场景 绘制 icon绘制动画 svg viewport 和 viewBox viewport 是 svg 图像的可见区域 viewBox 是用于在画布上绘制 svg 图形的坐标系统 在一下案例中 svg中 width“500” height“200” 就是可视区域 比如你的svg是100X100但是你的可视区域只有20X20 那么他…

c语言中的模拟多态性

在C语言中模拟多态性 多态性是面向对象编程中的一个核心概念&#xff0c;它允许我们通过一个共同的接口来操作不同的数据类型。虽然C语言是一种过程式语言&#xff0c;本身不直接支持面向对象的特性&#xff0c;如继承、封装和多态&#xff0c;但我们可以通过一些技巧来模拟这些…