蓝桥杯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;能够存储在文件或网络上&…

HTML快速入门笔记

一、HTML快速入门 说明&#xff1a;所有加*号内容代表不常用&#xff0c;了解即可。 HTML概述 超文本&#xff1a;Web是一个超文本的集合&#xff1b;超文本是web的基本组成单元&#xff0c;也成为网页或HTML文档&#xff0c;Web页等&#xff0c;通常以.html或.htm为后缀的文件…

Apache SeaTunnel 初识

文章目录 Apache SeaTunnel 初识为什么我们需要SeaTunnel使用场景特点解决的问题工作流连接器输入插件过滤插件输出插件引擎spark 和 flink 引擎SeaTunnel 引擎集群管理核心功能Apach

力扣1----10(更新)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按…

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

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

「Linux系列」Linux网络通讯/系统管理/系统设置/备份压缩/设备管理命令

文章目录 一、Linux网络通讯命令二、Linux系统管理命令三、Linux系统设置命令四、Linux备份压缩命令五、Linux设备管理命令六、相关链接 一、Linux网络通讯命令 Linux网络通讯命令是Linux系统中用于管理和调试网络功能的一系列工具。这些命令可以帮助用户查看网络状态、测试网…

SNMP学习笔记SNMPWALK命令

SNMPWALK是SNMP的一个工具&#xff0c;它使用SNMP的GETNEXT请求查询指定OID入口的所有OID树信息&#xff0c;并显示给用户。 IT监控系统常用snmpwalk获取支持SNMP的网络设备信息&#xff0c;使用snmpwalk收集交换机、路由器的CPU、内存、端口流量等信息。 使用snmpwalk需要安装…

Matlab实现序贯变分模态分解(SVMD)

大家好&#xff0c;我是带我去滑雪&#xff01; 序贯变分模态分解(SVMD) 是一种信号处理和数据分析方法。它可以将复杂信号分解为一系列模态函数&#xff0c;每个模态函数代表信号中的特定频率分量。 SVMD 的主要目标是提取信号中的不同频率分量并将其重构为原始信号。SVMD的基…

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

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

flutter 父组件调用子组件方法

标题在Flutter中&#xff0c;父组件可以通过GlobalKey来引用子组件&#xff0c;并调用子组件的方法。以下是一个简单的例子&#xff1a; 在这个例子中&#xff0c;ParentComponent 有一个GlobalKey&#xff0c;它被传递给了ChildComponent。当按钮被点击时&#xff0c;通过chi…

06 mybatis </sql>

文章目录 products.sqlpom.xmlmybatis-config.xmlProductsMapper.xmlProductsMapperImpl.javaProducts.javaDButil.javaProductsMapperImplTest.javaMapperTest.java products.sql create table products (product_id int auto_increment comment 产品IDprimary key,prod…

知识图谱-图数据库-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…

vuex状态管理的使用

一、创建store,单个store的使用 1、 /*** 该文件用于创建vuex中最核心的store*///引入Vuex import Vuex from vuex; import Vue from "vue";//使用vuex来集中管理状态,必要 //new store的前提是必须要使用Vuex插件 Vue.use(Vuex);//创建actions(本质就是对象) 用于…

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

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

vue项目中使用vue-pdf或pdf.Js,实现在页面上预览pdf内容

一。vue-pdf 1. 安装vue-pdf npm install --save vue-pdf2.页面引入 js部分 import pdf from "vue-pdf";data(){return {pdfUrl: "",pageTotal: 0,} }mounted(){this.pdfUrl pdf.createLoadingTask(pdf文件路径url);// 获取页码this.pdfUrl.promise…