【算法】【蓝桥23国A软件C】四版代码思路分析与逐步优化
题目来源:第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 A 组
题目描述:
问题描述
给定一个 W×H 的长方形,两边长度均为整数。小蓝想把它切割为很多个边长为整数的小正方形。假设切割没有任何损耗,正方形的边长至少为 2,不允许出现余料,要求所有正方形的大小相等,请问最多能切割出多少个?
输入格式
输入一行,包含两个整数 W, H,用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。如果不存在满足要求的方案,输出 0。
【测试用例及其规模见文末】
题目解析:
方法一:暴力求解(无关数论)(得分:7/10)
#include <iostream>
using namespace std;
#define ll long long
int main()
{ll w,h;cin>>w>>h;ll a=min(w,h);ll b=max(w,h); // 取较小的边为 a,较大为 bll ans=0;// 枚举 a 的约数(通过 a/i 形式间接枚举,a/i >= 2 保证正方形边长 ≥2)for(ll i=1; a/i >= 2; i++){if(a % i != 0) continue; // i 不是 a 的约数,跳过ll cur = a / i; // cur 是一个候选的正方形边长if(b % cur == 0) // 如果 b 也能整除 cur,说明 w 和 h 都能被 cur 整除ans = cur; // 更新当前满足条件的最大正方形边长}// 计算可以切多少个边长为 ans 的正方形ans = (a / ans) * (b / ans);cout << ans;return 0;
}
问题之一:粗心:没有判断找不到的情况,即输出ans=0的情况
思路分析:
-
目标是找一个最大的正方形边长 d(d ≥ 2),使得
w % d == 0 && h % d == 0,即正方形能完全铺满矩形; -
枚举的是
i,通过cur = a / i,我们得到了a的一个因数cur; -
如果
b % cur == 0,那说明cur也整除 b,即cur同时整除w和h; -
记录这个满足条件的最大
cur(实际上随着i增加,cur减小,所以最后ans是最大满足条件的正方形边长); -
用这个
ans去计算:一共能切(w / ans) * (h / ans)个正方形。
方法二:暴力求解(优化方法一)(得分:8/10)
#include <iostream>
using namespace std;
#define ll long long
int main()
{ll w,h;cin>>w>>h;ll a=min(w,h);ll b=max(w,h);ll ans=0;for(ll i=1;a/i>=2;i++){if(a%i!=0)continue;ll cur=a/i;if(b%cur==0)ans=cur;}if(ans!=0)ans=(a/ans)*(b/ans);cout<<ans;return 0;
}
优化了ans可能为0的情况
问题:该方法时间复杂度极高,因此有两组测试用例没有通过在 W, H ≤ 10^9 的范围下会超时,尤其在最坏情况(比如 W=10^9, H=10^9-1)下要跑上亿次循环。
假设 a = 10^9,那么最坏情况下你会从 i = 1 枚举到 i ≈ 5×10^8,也就是5亿次循环,这肯定爆了
方法三:暴力求解(优化方法二)(得分:10/10)
#include <iostream>
using namespace std;
#define ll long long
int main()
{ll w,h;cin>>w>>h;ll a=min(w,h);ll b=max(w,h);ll ans=0;for(ll i=a/2;i>=1;i--){if(a%i!=0)continue;ll cur=a/i;if(b%cur==0){ans=cur;break;}}if(ans!=0)ans=(a/ans)*(b/ans);cout<<ans;return 0;
}
为什么它能过所有测试?
-
从
a/2开始倒序找a的因数,最早遇到的符合条件的就是最大可行边长; -
一旦找到了合法边长就
break,省下后续判断; -
a/2 → 1最多只跑 5e8 次(极限),但实际用例中基本很快找到;
方法四:数论方法——最大公因数(得分:10/10)
#include<iostream>
using namespace std;
int gcd(long long a,long long b) {return b==0?a:gcd(b,a%b);//辗转相除法计算最大公约数
}signed main() {int w, h;cin >> w >> h;int up = gcd(w, h);if (up == 1) {cout << 0 << endl;return 0;}int ans = 0;for (int i = 2; i * i <= up; i++) {if (up % i == 0) {ans = i;break;}}if (!ans)ans = up;ans = (w * h) / (ans * ans);cout << ans << endl;return 0;
}
利用辗转相除法计算最大公约数(gcd函数)
方法:
-
把大数变成小数(用模
%) -
交换位置继续递归
直到余数为 0,此时的另一个数就是答案。
测试用例:
样例输入1
10 20
样例输出1
50
样例说明:切割成 5×10=505×10=50 个边长为 22 的正方形。
样例输入2
6 9
样例输出2
6
样例输入3
8 13
样例输出3
0
评测用例规模与约定
对于 30%30% 的评测用例,1≤W,H≤10001≤W,H≤1000;
对于 60%60% 的评测用例,1≤W,H≤1061≤W,H≤106;
对于所有评测用例,1≤W,H≤1091≤W,H≤109。
相关文章:
【算法】【蓝桥23国A软件C】四版代码思路分析与逐步优化
题目来源:第十四届蓝桥杯大赛软件赛国赛C/C 大学 A 组 题目描述: 问题描述 给定一个 WH 的长方形,两边长度均为整数。小蓝想把它切割为很多个边长为整数的小正方形。假设切割没有任何损耗,正方形的边长至少为 2,不允…...
网络安全·第三天·ICMP协议安全分析
一、ICMP功能介绍 ICMP(Internet Control Message Protocal)是一种差错和控制报文协议,不仅用于传输差错报文, 还传输控制报文,但是ICMP只是尽可能交付,提供的服务是无连接、不可靠的,并不能保…...
SpringBoot对接火山引擎大模型api实现图片识别与分析
文章目录 一、前言二、创建应用三、后端1.SDK集成2.调用Rest API 四、前端 一、前言 Spring AI实战初体验——实现可切换模型AI聊天助手-CSDN博客 如上,在上一篇博客,我们已经实现了spring ai对接本地大模型实现了聊天机器人,但是目前有个新…...
单片机方案开发 代写程序/烧录芯片 九齐/应广等 电动玩具 小家电 语音开发
在电子产品设计中,单片机(MCU)无疑是最重要的组成部分之一。无论是消费电子、智能家居、工业控制,还是可穿戴设备,小家电等,单片机的应用无处不在。 单片机,简而言之,就是将计算机…...
Open Interpreter:重新定义人机交互的开源革命
引言 在人工智能技术蓬勃发展的今天,人机交互的方式正经历着前所未有的变革。Open Interpreter,作为一个开源项目,正在重新定义我们与计算机的互动方式。它允许大型语言模型(LLMs)在本地运行代码,通过自然…...
解决前端使用Axios时的跨域问题
跨域问题是前端开发中常见的问题,当你的前端应用尝试访问不同域名、端口或协议的API时就会出现。以下是几种解决方案: 1. 后端解决方案 CORS (推荐) 后端需要设置正确的响应头: Access-Control-Allow-Origin: * // 或指定具体域名 Acces…...
ARCGIS PRO 在已建工程地图中添加在线地图
一、手工添加 如图所示: 1、在上方的菜单栏中点击“插入”,选择“连接” 2、新建ArcGIS Server 3、在弹出框中输入在线图集的URL,点击“确定” https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer 4、查看在…...
ScholarCopilot:“学术副驾驶“
这里写目录标题 引言:学术写作的痛点与 AI 的曙光ScholarCopilot 的核心武器库:智能生成与精准引用智能文本生成:不止于“下一句”智能引用管理:让引用恰到好处 揭秘背后机制:检索与生成的动态协同快速上手:…...
MATLAB仿真多相滤波抽取与插值的频谱变化(可视化混叠和镜像)
MATLAB画图仿真多相滤波抽取与插值的频谱变化 可视化多速率信号处理抽取与插值的频谱变化 实信号/复信号 可视化混叠和镜像 目录 前言 一、抽取的基本原理 二、MATLAB仿真抽取运算 三、内插的基本原理 四、MATLAB仿真内插运算 总结 前言 在多速率系统中增加信号采样率的运…...
mongodb 远程访问
mongodb 远程访问 MongoDB 数据库的远程访问通常需要一些配置步骤,以确保安全性并正确设置网络访问权限。以下是一些基本步骤来允许远程访问 MongoDB 数据库: 修改 MongoDB 配置文件 首先,你需要编辑 MongoDB 的配置文件(通常是 …...
DAY 44 leetcode 28--字符串.实现strStr()
题号28 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 我的解法 双指针,slow定位&…...
MySQL-存储引擎索引
存储引擎 MySQL体系结构 1). 连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念,为通过认证安…...
图像处理有哪些核心技术?技术发展现状如何?
在数字化信息爆炸的时代,文档图像预处理技术正悄然改变着我们处理文字信息的方式。无论是手持拍摄的收据、扫描仪中的身份证,还是工业机器人采集的复杂文档,预处理技术都在背后默默提升着OCR(光学字符识别)系统的性能。…...
【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
KEGG注释脚本kofam2kegg.py--脚本010
采用kofam结合kegg官网htxt进行注释 用法: python kofam2kegg.py kofam.out ath00001.keg my_kegg_output code: import sys from collections import defaultdictdef parse_kofam_file(kofam_file):ko_to_genes defaultdict(list)with open(kofam_file) as f:…...
spring cloud OpenFeign 详解:安装配置、客户端负载均衡、声明式调用原理及代码示例
OpenFeign 详解:安装配置、客户端负载均衡、声明式调用原理及代码示例 1. OpenFeign 安装与配置 (1) 依赖管理 <!-- pom.xml 添加以下依赖 --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud…...
【Java八股】
JVM JVM中有哪些引用 在Java中,引用(Reference)是指向对象的一个变量。Java中的引用不仅仅有常规的直接引用,还有不同类型的引用,用于控制垃圾回收(GC)的行为和优化性能。JVM中有四种引用类型…...
用 Deepseek 写的uniapp血型遗传查询工具
引言 在现代社会中,了解血型遗传规律对于优生优育、医疗健康等方面都有重要意义。本文将介绍如何使用Uniapp开发一个跨平台的血型遗传查询工具,帮助用户预测孩子可能的血型。 一、血型遗传基础知识 人类的ABO血型系统由三个等位基因决定:I…...
程序化广告行业(84/89):4A广告代理公司与行业资质解读
程序化广告行业(84/89):4A广告代理公司与行业资质解读 大家好!在探索程序化广告行业的道路上,每一次知识的分享都是我们共同进步的阶梯。一直以来,我都希望能和大家携手前行,深入了解这个充满机…...
go语言gRPC使用流程
1. 安装工具和依赖 安装 Protocol Buffers 编译器 (protoc) 下载地址:https://github.com/protocolbuffers/protobuf/releases 使用说明:https://protobuf.dev/ 【centos环境】yum方式安装:protoc[rootlocalhost demo-first]# yum install …...
【眼底辅助诊断开放平台】项目笔记
这是一个标题 任务一前端页面开发:后端接口配置: 任务二自行部署接入服务 日志修改样式和解析MD文档接入服务 Note前端登陆不进去/更改后端api接口304 Not Modifiedlogin.cache.jsonERR_CONNECTION_TIMED_OUT跨域一般提交格式proxy.ts src/coponents 目录…...
Java笔记5——面向对象(下)
目录 一、抽象类和接口 1-1、抽象类(包含抽象方法的类) 1-2、接口 编辑编辑 二、多态 编辑 1. 自动类型转换(向上转型) 示例: 注意: 2. 强制类型转换(向下转型) 示…...
NI的LABVIEW工具安装及卸载步骤说明
一.介绍 最近接到个转交的项目,项目主要作为上位机工具开发,在对接下位机时,有用到NI的labview工具。labview软件是由美国国家仪器(NI)公司研制开发的一种程序开发环境,主要用于汽车测试、数据采集、芯片测…...
[reinforcement learning] 是什么 | 应用场景 | Andrew Barto and Richard Sutton
目录 什么是强化学习? 强化学习的应用场景 广告和推荐 对话系统 强化学习的主流算法 纽约时报:Turing Award Goes to 2 Pioneers of Artificial Intelligence wiki 资料混合:youtube, wiki, github 今天下午上课刷到了不少࿰…...
css一些注意事项
css一些注意事项 .bg_ {background-image: url(/static/photo/activity_bg.png);background-size: 100% auto;background-repeat: no-repeat;background: linear-gradient(to bottom, #CADCEA, #E8F3F6);min-height: 100vh; } 背景图片路径正确但是并没有显示 // 方案1&…...
[从零开始学数据库] 基本SQL
注意我们的主机就是我们的Mysql数据库服务器 这里我们可以用多个库 SQL分类(核心是字段的CRUD)  重点是我…...
react/vue中前端多图片展示页面优化图片加载速度的五种方案
需求背景 在多项目中 例如官网项目中 会出现很多大图片显示的情况 这个时候就会出现图片过大 公司带宽不够之类导致页面加载速度过慢及页面出现后图片仍然占位但并未加载出来 或者因为网络问题导致图片区域黑块等等场景 这个时候我们就要对图片和当前场景进行优化 方案定…...
qt中的正则表达式
问题: 1.在文本中把dog替换成cat,但可能会把dog1替换成cat1,如果原本不想替换dog1,就会出现问题 2文本中想获取某种以.txt为结尾的多有文本,普通的不能使用 3如果需要找到在不同的系统中寻找换行符,可以…...
AT_abc400_e [ABC400E] Ringo‘s Favorite Numbers 3 题解
题目传送门 题目大意 题目描述 对于正整数 N N N,当且仅当满足以下两个条件时, N N N 被称为 400 number: N N N 恰好有 2 2 2 种不同的素因数。对于 N N N 的每个素因数 p p p, N N N 被 p p p 整除的次数为偶数次。更严…...
git 提交标签
Git 提交标签 提交消息格式: <type>: <description> (示例:git commit -m "feat: add user login API") 标签适用场景feat新增功能(Feature)。fix修复 Bug(Bug fix&…...
