Peter算法小课堂—枚举优化

哈哈哈,新年快乐!这一次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.mfbz.cn/a/380309.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

四、机器学习基础概念介绍

四、机器学习基础概念介绍 1_机器学习基础概念机器学习分类1.1 有监督学习1.2 无监督学习 2_有监督机器学习—常见评估方法数据集的划分2.1 留出法2.2 校验验证法&#xff08;重点方法&#xff09;简单交叉验证K折交叉验证&#xff08;单独流出测试集&#xff09;&#xff08;常…

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…

arkTS开发鸿蒙OS应用(登录页面实现,连接数据库)

前言 喜欢的朋友可在抖音、小红书、微信公众号、哔哩哔哩搜索“淼学派对”。知乎搜索“编程淼”。 前端架构 Toubu.ets import router from ohos.router Component export struct Header{build(){// 标题部分Row({space:5}){Image($r(app.media.fanhui)).width(20).onClic…

Mysql-数据库优化-客户端连接参数

客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数&#xff0c;一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数&#xff0c;一个数据库能够支撑最大的连接数是多少呢&#xff1f; …

【Spring】springmvc如何处理接受http请求

目录 ​编辑 1. 背景 2. web项目和非web项目 3. 环境准备 4. 分析链路 5. 总结 1. 背景 今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的&#xff1f;”&#xff1b;看完之后突然想到&#xff0c;在请求走到mvc 之前服务是怎么知道有请求进来…

使用QT编写一个简单QQ登录界面

widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(…

3.2-媒资管理之MinIo分布式文件系统+上传图片

媒资管理 3 分布式文件系统 3.1 什么是分布式文件系统 要理解分布式文件系统首先了解什么是文件系统。 查阅百度百科&#xff1a; 文件系统是负责管理和存储文件的系统软件&#xff0c;操作系统通过文件系统提供的接口去存取文件&#xff0c;用户通过操作系统访问磁盘上的文…

5.常量和数据类型(数字类型,字符串类型,模板字符串,布尔类型undefined,null检测数据类型),类型转化

什么是常量 常量就是不能改变的量&#xff0c;就是向计算机内存要一款空间然后存储的东西不能改变用const声明并且一定要初始化值 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-C…

SAP-PS-001-006问题预算占用与订单实际金额不一致

前言 PS模块最复杂的业务场景主要就是ETO&#xff08;Engineering-To-Order&#xff09;&#xff0c;也就是边设计边生产边采购的三边业务。 意味着从前端设计开始的成本就已经要进行收集&#xff0c;其次对于大型非标设备的生产发货只是一个环节&#xff0c;发货后还会涉及到现…

STL之stack+queue的使用及其实现

STL之stackqueue的使用及其实现 1. stack&#xff0c;queue的介绍与使用1.1stack的介绍1.2stack的使用1.3queue的介绍1.4queue的使用 2.stack&#xff0c;queue的模拟实现2.1stack的模拟是实现2.2queue的模拟实现 3.总结 所属专栏&#xff1a;C“嘎嘎" 系统学习❤️ &…

API网关架构设计与实现的经验总结与实践

API网关是现代微服务架构中的重要组件&#xff0c;它充当了前端和后端微服务之间的中介。本文将介绍API网关的架构设计原则和实现方法&#xff0c;以帮助开发人员更好地理解和应用这些技术。 1. 什么是API网关&#xff1f; - 解释了API网关的基本概念和作用&#xff0c;以及…

【c++入门】母牛生小牛

说明 有一头小母牛&#xff0c;从出生第四年起每年生一头小母牛&#xff0c;按此规律&#xff0c;第N年时有几头母牛&#xff1f; 输入数据 只有一个整数N&#xff0c;独占一行。(1≤N≤50) 输出数据 对每组数据&#xff0c;输出一个整数&#xff08;独占一行&#xff09;…

SAP-PS-02-003跨系统/Client请求传输和请求副本的创建

前言 某公司SAP服务器架构如下&#xff08;举例&#xff09;&#xff0c;一般进行SAP项目实施基本会遵循以下的系统和Client准则&#xff0c;那在不同系统和Client要如何进行请求传输呢 服务器 Client 作用 要求 DEV 100 业务顾问进行系统配置 所有配置均在该Client进行…

如何用Hexo搭建一个优雅的博客

引言 在数字化时代&#xff0c;拥有一个个人博客已经成为许多人展示自己技能、分享知识和与世界互动的重要方式。而在众多博客平台中&#xff0c;Hexo因其简洁、高效和易于定制的特点而备受青睐。本文将详细介绍如何从零开始搭建一个Hexo博客&#xff0c;让你的个人博客在互联…

synchronized关键字的底层原理

一、synchronized的使用方式 在语法上&#xff0c;要使用synchronized关键字&#xff0c;需要把任意一个非null对象作为"锁"对象&#xff0c;也就是需要一个对象监视器&#xff08;Object Monitor&#xff09;。总的来说有三种用法&#xff1a; 1.1 作用在实例方法…

【C++第二阶段】运算符重载-【+】【cout】【++|--】

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 运算符重载加法运算符重载重载左移运算符递增|减运算符重载 运算符重载 加法运算符重载 What 普通的加减乘除&#xff0c;只能应付C中已给定的数据类型的运…

如何像工程师一样阅读 - 快速阅读技术书籍的9个技巧

0. 目的 在看了 Read Like an Engineer: 9 Tips for Reading Technical Books Fast 之后&#xff0c; 记录一些个人的看法&#xff0c;并在这篇英文文章上作为实验&#xff0c; 记录一下正确的阅读方法。 1. 第一次阅读 1.1 生词表 parcel of the job: 工作中必不可少的部分…

OpenCV-33 开运算和闭运算

目录 一、开运算 二、闭运算 三、形态学梯度 开运算和闭运算都是腐蚀和膨胀的基本应用。 一、开运算 开运算 腐蚀膨胀(腐蚀之后再膨胀) 开运算提供了另一种去除噪声的思路。&#xff08;腐蚀先进行去噪&#xff0c;膨胀再还原图像&#xff09; 通过API --- morphologyE…

面试经典150题——两数之和 II - 输入有序数组

"The only limit to our realization of tomorrow will be our doubts of today." - Franklin D. Roosevelt 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 暴力求解的思路就是通过两次for循环&#xff0c;外层循环遍历整个数组&#xff0c;内层循环遍…
最新文章