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

news2024/11/15 11:13:36

题目链接:

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.coloradmin.cn/o/1546778.html

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

相关文章

C语言笔记:重学输入和输出

ACM金牌带你零基础直达C语言精通-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a;ACM金牌带你零基础直达C语言精通https://www.bilibili.com/cheese/play/ep159068?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说…

AI论文速读 | 具有时间动态的路网语义增强表示学习

论文标题&#xff1a; Semantic-Enhanced Representation Learning for Road Networks with Temporal Dynamics 作者&#xff1a; Yile Chen&#xff08;陈亦乐&#xff09; ; Xiucheng Li&#xff08;李修成&#xff09;; Gao Cong&#xff08;丛高&#xff09; ; Zhifeng Ba…

深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析

iOS开发作为移动应用开发的重要领域之一&#xff0c;对于开发人员具有重要意义。本文将深入探讨iOS开发的各个方面&#xff0c;从创建第一个iOS程序到纯代码实现iOS开发&#xff0c;带领读者全面了解iOS应用程序的开发流程和技术要点。 &#x1f4f1; 第一个iOS程序 在创建第…

第1章 实时3D渲染流水线

前言 本书所剖析的Unity 3D内置着色器代码版本是2017.2.0f3&#xff0c;读者可以从Unity 3D官网下载这些着色器代码。这些代码以名为builtin_shaders-2017.2.0f3.zip的压缩包的形式提供&#xff0c;解压缩后&#xff0c;内有4个目录和1个license.txt文件。 目录CGIncludes存放了…

【系统架构师】-基础知识整理

1、面向对象设计得四种关系 关系类型概念特点例子关联关系表示不同类的对象之间有联系&#xff0c;但是一方并不完全拥有另一方&#xff0c;也不对其生命周期负责。关联关系可以是单向的也可以是双向的。耦合度高通常用来表示不同类的对象之间的联系&#xff0c;如“使用”或“…

Kafka消费者:监听模式VS主动拉取,哪种更适合你?

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Kafka消费者&#xff1a;监听模式VS主动拉取&#xff0c;哪种更适合你&#xff1f; 前言监听模式的实现监听器&#xff08;Listener&#xff09;的概念和作用使用监听器实现 Kafka 消费者的步骤和方法…

DDoS攻击升级,解读防御DDoS攻击的几大有效方法

前不久&#xff0c;Gcore发布了2023年第三、四季度DDoS攻击趋势报告&#xff0c;报告中指出DDoS攻击的规模以及复杂性持续增长&#xff0c;且这种增长是触目惊心的。全球每天大约发生23000次DDoS攻击&#xff0c;每39秒就会发生一次新的网络攻击&#xff0c;电信公司、政府部门…

javaSwing连连看游戏

一、简介 基于java的连连看游戏设计和实现&#xff0c;基本功能包括&#xff1a;消除模块&#xff0c;重新开始模块&#xff0c;刷新模块&#xff0c;选择难度模块&#xff0c;计时模块。本系统结构如下&#xff1a; &#xff08;1&#xff09;消除模块&#xff1a; 完成连连…

【MATLAB源码-第13期】基于matlab的4ASK的误码率BER和误符号率SER理论和实际对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 "4ASK" 是一种数字调制技术&#xff0c;代表4级振幅移移键控&#xff08;4-Level Amplitude Shift Keying&#xff09;调制。它是一种数字通信中常用的调制方式之一&#xff0c;用于将数字信号转换为模拟信号以便传…

map china not exists. the geojson of the map must be provided.

map china not exists. the geojson of the map must be provided. 场景&#xff1a;引入echarts地图报错map china not exists. the geojson of the map must be provided. 原因&#xff1a; echarts版本过高&#xff0c;ECharts 之前提供下载的矢量地图数据来自第三方&…

小白学视觉 | 图像上的 OpenCV 算术运算

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;图像上的 OpenCV 算术运算 1 OpenCV 简介 图像可以进行算术运算&#xff0c;例如加法、减法和按位运算&#xff08;AND、OR、NOT、XOR&#xff09;。…

模拟器App抓包 - 证书双向验证绕过手段

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog 0x00 Frida 环境配置 1. 本地安装 Frida pip install frida pip install frida-tools2. 模拟器安装 Fr…

【详细讲解yarn的安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

leetcode 15.三数之和 JAVA 双指针法

题目 思路 双指针法 去重 为啥要去重呢&#xff1f;因为题目中说了要返回不重复的三元组。拿示例1来看&#xff0c;&#xff08;-1&#xff0c;0&#xff0c;1&#xff09;和&#xff08;0&#xff0c;1&#xff0c;-1&#xff09;虽然都等于0&#xff0c;但其实它们里面的数…

Unix环境高级编程-学习-08-自旋锁与屏障

目录 一、多线程相关文章链接 二、自由抒发 1、自旋锁 2、屏障 三、函数介绍 1、pthread_spin_init &#xff08;1&#xff09;声明 &#xff08;2&#xff09;作用 &#xff08;3&#xff09;参数 &#xff08;4&#xff09;返回值 &#xff08;5&#xff09;注意点 …

c语言文件操作(下)

目录 1.文件的随机读写1.1 fseek1.2 ftell1.3 rewind 2. 文件结束的判定2.1 文本文件读取结束的判断2.2 二进制文件读取结束的判断 3. 文件缓冲区 1.文件的随机读写 1.1 fseek 根据⽂件指针的位置和偏移量来定位⽂件指针。 函数原型&#xff1a; int fseek (FILE * stream,…

Python篇之网络编程,实现简单的服务端和客户端的内容传输

本小节内容&#xff1a;实现简单的信息交流 文章目录 一、 Socket介绍二、客户端与服务端三、在python中实现网络通信1. 服务端2. 客户端3. 连接测试 一、 Socket介绍 socket (简称 套接字) 模块是其内置的标准库之一&#xff0c;它实现了BSD sockets API&#xff0c;允许开发…

(分享)一个图片添加水印的小demo的页面,可自定义样式

有时候想给某张图片添加一个自己的水印&#xff0c;但是又懒的下载相应软件&#xff0c;用js canvas制作一个静态页面&#xff0c;对于单张图片添加自定义文字水印&#xff0c;大小 间距&#xff0c;角度可调。 页面如下&#xff1a; 选择图片&#xff0c;设置相应参数&#x…

深度学习模型部署(十二)CUDA编程-绪

CUDA 运行时 API 与 CUDA 驱动 API 速度没有差别&#xff0c;实际中使用运行时 API 较多&#xff0c;运行时 API 是在驱动 API 上的一层封装。​ CUDA 是什么&#xff1f;​ CUDA(Compute Unified Device Architecture) 是 nvidia 推出的一个通用并行技术架构&#xff0c;用它…

【LLM】大模型推理加速 KV-Cache

目录 模型推理过程KV Cache原理KV Cache的存储 模型推理过程 在了解KVCache之前&#xff0c;我们需要知道Transformer类大模型的推理过程。 对于LLM进行一次前向传播也就是生成一个token的过程可以被分解成以下步骤&#xff1a; 文本 T i n p u t T_{input} Tinput​经过Toke…