蓝桥杯2023年第十四届省赛真题-买瓜|DFS+剪枝

题目链接:

0买瓜 - 蓝桥云课 (lanqiao.cn)

蓝桥杯2023年第十四届省赛真题-买瓜 - C语言网 (dotcpp.com)

(蓝桥官网的数据要求会高一些)

说明:

这道题可以分析出:对一个瓜有三种选择:

  1. 不拿,切的次数不变,买瓜的重量不变
  2. 拿一半,切的次数加一,加这个瓜一半的重量
  3. 拿一整个瓜,切的次数不变,加这个瓜的重量

所以,DFS程序分支数确定为三个,传递的参数确定为:现在买到的重量cw,现在切的个数cnt,选到几个瓜了k。

终止条件1为:n个瓜全部都选择完毕;

终止条件2为:买的瓜重量到达m。

但是由于n的范围在1到30,所以时间复杂度达到了O(2^{30}),会超时。必须考虑剪枝。

那么比较任意想到的剪枝思路有三种

1.当前的重量加上剩下所有的瓜都小于m,肯定不能找到答案了,不继续向下找了。于是就先预处理,预先计算出第i个瓜到最后一个瓜的总重量  ,在dfs的时候好使用。

2.当前的重量(小于m的情况下)加上最小的瓜的一半重量都大于m,肯定不行。

3.当前切的次数比找到的次数多或者相同了,剪掉。

那么剪枝的几个方法就确定了,我比较喜欢在递归分支前加判断,能递归下去才递归,避免栈的频繁调用。所以三个分支前都加了if语句。

这里还需要注意

1.long long的范围是大于e18的,所以质量可以都乘2处理,防止出现小数。但是本题用小数也能全通过样例。如果用小数,在处理小数的比较相等的时候,要采用差值绝对值小于一个很小的数的方式,瓜的重量也要除以2.0 。

2.要对瓜预先排序,但排序必须降序排(降序排之后就能AC了),先选大的,更快排除一些搜索的分支。题目要求的其实就是尽量买整个的瓜。所以在写dfs分支时也把买整个的分支放在第一位。注意c++默认是升序排列,降序要这样写

//降序 sort(A.begin()+1,A.end(),greater<int>());

 

在洛谷的题解区有优化成折半搜索的解法,但放在蓝桥官网上AC不了,所以不再说明,只放个链接:P9234 [蓝桥杯 2023 省 A] 买瓜 - 洛谷 | 计算机科学教育新生态 (lu
ogu.com.cn)

代码如下:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N =30+10;
int ans = 0;
int n;
int m,sum[N];
vector<int> A;void dfs(int k,int cnt,double cw){if(cnt>=ans) return;//是 绝对值 小于 一个极小的数  if(abs(cw-m)<1E-5){ans=cnt;return;}if(sum[k]+cw<m) return;//要在判断重量是否合法之后再判断k,因为我的选择 第n个瓜的重量之后,在k=n+1的时候才体现 if(k>n) return;//if(cw>m) return;if(cw+A[k]<=m) dfs(k+1,cnt,cw+A[k]);if(cw+A[k]/2.0<=m&&(cnt+1)<ans) dfs(k+1,cnt+1,cw+A[k]/2.0);//前面判断了cw 是否等于m,这里肯定cw小于m,如果加上最小的重量都大于m,那么这个分支就不能找到合法答案 if(cw+A[n]/2.0>m) return;dfs(k+1,cnt,cw);}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;//瓜的个数,想要的总重量 ans=n+1;A.assign(n+1,0);for(int i=1;i<=n;i++){cin>>A[i];
//如果有一个瓜重量等于m直接可以得出答案,当然这里也可以判断一次每个瓜切成两半
//有没有等于m的if(A[i]==m) {ans=0;}}//关键:降序sort(A.begin()+1,A.end(),greater<int>());sum[n]=A[n];//预处理 算出从第i个瓜到最后一个瓜的总重量   for(int i=n-1;i>=1;i--){sum[i]=sum[i+1]+A[i];}	if(A[n]>m){cout<<-1;}else{if(ans==n+1)dfs(1,0,0);//不用单独再用一个变量来标志了,直接用ans的变化来标识是否至少找到一个合法的答案if(ans!=n+1) cout<<ans;else cout<<-1;}return 0;
}

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

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

相关文章

Hbase解决ERROR: KeeperErrorCode = ConnectionLoss for /hbase/master报错

在使用hbase时出错&#xff0c;错误如下图&#xff1a; 错误原因&#xff1a; 返回去检查启动的Hadoop与zookeeper&#xff0c;发现zookeeper的状态不对&#xff0c;重新启动了一下zookeeper&#xff0c;确保所有机器的zookeeper都启动起来了就可以了。

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate&#xff08;1&#xff09; Feign的介绍&#xff08;1.1&#xff09; 使用Feign的步骤&#xff08;1.2&#xff09; 自定义配置&#xff08;2&#xff09; 配置Feign日志的两种方式&#xff08;2.1&#xff09; Feign使用优化…

【C++】哈希应用之位图

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.位图的概念 2.位…

解决“Pycharm中Matplotlib图像不弹出独立的显示窗口”问题

matplotlib的绘图的结果默认显示在SciView窗口中, 而不是弹出独立的窗口, 这样看起来就不是很舒服&#xff0c;不习惯。 通过修改设置&#xff0c;改成独立弹出的窗口。 File—>Settings—>Tools—>Python Scientific—>Show plots in toolwindow 将√去掉即可

初识C++(三)构造函数和析构函数

目录 一、构造函数&#xff1a; 1.构造函数的概念&#xff1a; 2.构造函数的特性&#xff1a; 3.构造函数的形式&#xff1a; 4.为什么要引出构造函数这一概念 5.默认构造函数包括&#xff1a; 6.对默认生成的构造函数不处理内置类型的成员这事的解决办法&#xff1a; …

【Python机器学习系列】skearn机器学习模型的保存---pickle法

这是我的第246篇原创文章。 一、引言 pickle是Python 的标准库&#xff0c;用于序列化对象。可以使用 pickle.dump()将模型保存到文件&#xff0c;然后使用 pickle.load()从文件中加载模型。 序列化&#xff1a;指将一个对象转换为字节流&#xff0c;能够存储在文件或网络上&…

计算机网络:现代通信的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

异地两台电脑如何共享文件?

在当前数字化时代&#xff0c;人们对于数据的使用和管理变得越来越便捷。由于工作和生活的需要&#xff0c;我们常常需要在异地的电脑间共享文件。这给我们的工作和生活带来了一定程度的不便。有没有一种便捷的方法可以让异地的电脑实现文件的共享呢&#xff1f;答案是肯定的。…

知识图谱-图数据库-neo4j (1)踩坑记录

1、neo4j 安装 材料 &#xff1a; openjdk11 (neo4j 最低jdk版本要求) neo4j-community-4.4.30 CentOS 7.8 Release Date: 25 January 2024 Neo4j 4.4.30 is a maintenance release with many important improvements and fixes. Neo4j Deployment Center - Graph Database…

【前端面试3+1】01闭包、跨域

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

Linux 搭建jenkins docker

jekin docker gitee docker 安装 jenkins docker run -d --restartalways \ --name jenkins -uroot -p 10340:8080 \ -p 10341:50000 \ -v /home/docker/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker je…

QT数据类型和容器用法

Qt库提供了基于通用模板的容器类, 这些类可用于存储指定类型的数据项&#xff0c;Qt中这些容器类的设计比STL容器更轻&#xff0c;更安全且更易于使用。容器类也都是隐式共的&#xff0c;它们是可重入的&#xff0c;并且已针对速度/低内存消耗和最小的内联代码扩展进行了优化&a…

【解析几何】 【多源路径】 【贪心】1520 最多的不重叠子字符串

作者推荐 视频算法专题 本身涉及知识点 解析几何 图论 多源路径 贪心 LeetCode1520. 最多的不重叠子字符串 给你一个只包含小写字母的字符串 s &#xff0c;你需要找到 s 中最多数目的非空子字符串&#xff0c;满足如下条件&#xff1a; 这些字符串之间互不重叠&#xff0…

Wireshark使用实训---分析IP包

1.Wireshark简介和作用 Wireshark是一个开源的网络分析工具&#xff0c;用于捕捉和分析网络数据包。它可以帮助网络管理员和安全专家监控和解决网络问题&#xff0c;同时也可以用于学习和教学网络通信原理。 Wireshark可以在网络中捕获和分析传输的数据包&#xff0c;包括协议…

【Java初阶(五)】类和对象

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1. 前言2.面向对象的认识3.类的认识4. 类的实例化4.1什么是实例化4.2类和对象的说明 5.this引用6.对象初始化6.1 构造方法 7.static关键字8.代码块8.1 …

PTAxt的考研路

xt是我院19级专业第一&#xff0c;但他认为保研并不能展示他全部的实力&#xff0c;所以他在22年初试一结束就加入了23考研的队伍中&#xff0c;并且他为了填补我院近些年来无北大研究生的空白&#xff0c;毅然决然决定扛起19级的大旗&#xff0c;在学校百年华诞之际献上他最诚…

光明源@智慧公厕赋能“厕所革命”主要体现在哪些方面?

当我们提及厕所&#xff0c;不再仅是简单的卫生设施&#xff0c;而是一种对生活品质的关怀与呵护。智慧公厕&#xff0c;作为厕所革命的引领者&#xff0c;以其独特的拟人魅力&#xff0c;彰显着人性化关怀的新风尚。今日&#xff0c;让我们一同探索&#xff0c;智慧公厕是如何…

数据库备份工具(实现数据定时覆盖)

数据库备份工具&#xff08;实现数据定时覆盖&#xff09; 永远热爱&#xff0c;永远执着&#xff01; 工具介绍 自动化测试数据库更新调度程序 这段 Python 脚本自动化了每天定时从生产数据库更新测试数据库的过程。它利用了 schedule 库来安排并执行每天指定时间的更新任务…

在for循环加判断条件当条件都满足时,同时显现的解决方法

一、代码示例 function fu(s) {str ;ste ;console.log(s);let Things s;for (let i 0; i < Things.length; i) {if (Things[i].pid kk) {console.log(Things[i].pid);ste <div class"commodity_nei"><div class"zxc_pic"><div cl…

[CISCN2019 总决赛 Day2 Web1]Easyweb ----不会编程的崽

CISCN的题质量还是很高的。 又是这熟悉的登陆界面。爆破&#xff1f;sql&#xff1f;还是xxe等。先看源码 估摸着也是sql注入。但似乎不是常规注入。同时扫描后台的结果应该也出来了&#xff0c;发现robots.txt 有点懵&#xff0c;后边看了大佬的wp才知道&#xff0c;提示的是*…