蓝桥杯2023年-买瓜(dfs,类型转换同样耗时)

题目描述

小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜,每个瓜的重量为 Ai 。

小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。

小蓝希望买到的瓜的重量的和恰好为 m 。

请问小蓝至少要劈多少个瓜才能买到重量恰好为 m 的瓜。如果无论怎样小蓝都无法得到总重恰好为 m 的瓜,请输出 −1 。

思路

朴素做法:

dfs每个瓜,有三种选择:

1.选瓜

2.劈瓜,选瓜

3.不选瓜

则复杂度为3^n,也就是3^30,大概2e14,绝对会超时。

所以需要剪枝优化

剪枝优化:

1.如果当前已有重量>所需重量,则剪枝

2.如果当前已有重量+剩下的重量总和<所需重量,剪枝,(求剩下的重量可以用后缀和数组优化)

3.如果当前已经劈过的次数>=目前的劈瓜的最小次数,剪枝

细枝末节:

还有一些细枝末节可优化:

1.除2的话可能会有小数,但是浮点数运算会慢很多,所以我们可以通过放大(乘2)原重量与所需重量。这样就可以只使用整型运算了。(也可以用两个数组分别存储放大后的重量与相应的减半的数量,这样可以在每次搜索时减少一次运算,不过应该影响不大)

2.将重量从大到小排序,这样可以提前排除许多剪枝。

3.强制类型转换的耗时也不少。(int转long之类的)(这一点是我没有想到的,也是我卡题的原因,经过不断不断一直一直反反复复的比对题解代码后才发现的。)

大家可以感受一下:

有转换的耗时,结果超时一半多

#include<bits/stdc++.h>
using namespace std;
int a[33];//原重
int b[33];//半重
long latter[33];
int m;
int n;
int ans=100;
void dfs(int u,int sum,int k){//sum为int类型时,long与int进行加减时会进行一次类型转换if(u==n||sum>=m||k>=ans||latter[u]+sum<m){if(sum==m)ans=min(ans,k);return ;}dfs(u+1,sum+a[u],k);dfs(u+1,sum+b[u],k+1);dfs(u+1,sum,k);
}
int main()
{cin>>n>>m;m*=2;for(int i=0;i<n;i++){cin>>b[i];a[i]=b[i]*2;}sort(a,a+n,greater<int>());sort(b,b+n,greater<int>());for(int i=n-1;i>=0;i--)latter[i]=latter[i+1]+a[i];dfs(0,0,0);if(ans!=100)cout<<ans;else cout<<-1;
}

没有类型转换的,成功通过,二者时间整整相差一倍

#include<bits/stdc++.h>
using namespace std;
int a[33];//原重
int b[33];//半重
long latter[33];
int m;
int n;
int ans=100;
void dfs(int u,long sum,int k){//sum为long类型时,没有类型转换的耗时if(u==n||sum>=m||k>=ans||latter[u]+sum<m){if(sum==m)ans=min(ans,k);return ;}dfs(u+1,sum+a[u],k);dfs(u+1,sum+b[u],k+1);dfs(u+1,sum,k);
}
int main()
{cin>>n>>m;m*=2;for(int i=0;i<n;i++){cin>>b[i];a[i]=b[i]*2;}sort(a,a+n,greater<int>());sort(b,b+n,greater<int>());for(int i=n-1;i>=0;i--)latter[i]=latter[i+1]+a[i];dfs(0,0,0);if(ans!=100)cout<<ans;else cout<<-1;
}

也不排除是测评机的原因,不过以后最好还是减少类似的类型转换更保险一些。

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

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

相关文章

匿名内部类

隐藏了名字的内部类 javap 反编译命令 格式: new 类名或者接口名(){重写方法};

Windows下PostgreSQL安装教程

一、下载 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

二本双非|逆袭985/211只要做好这3件事

我的本科学校就是双非&#xff0c;但是我并不觉得考研是一件非常容易地事情&#xff0c;并且我身边的同学也没有一个觉得考研很轻松。可能网上很多经验贴说自己双非上岸985&#xff0c;二本上岸985&#xff0c;我觉得这是大家陷入了互联网时代的信息茧房。 考研不管是对985/211…

word里面文字为什么会自动另起一行

有时候我们从别处复制过来的内容&#xff0c;一行还未完经常会自动另起一行&#xff0c;这是怎么回事呢&#xff1f;大多是回车符&#xff08;WORD的段落标记&#xff09;导致的&#xff0c;操作方法如下&#xff1a; 两端对齐

设计模式-行为型模式-职责链模式

在软件系统运行时&#xff0c;对象并不是孤立存在的&#xff0c;它们可以通过相互通信协作完成某些功能&#xff0c;一个对象在运行时也将影响到其他对象的运行。行为型模式&#xff08;Behavioral Pattern&#xff09;关注系统中对象之间的交互&#xff0c;研究系统在运行时对…

Learn OpenGL 02 你好,三角形

图形渲染管线 图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分 首先&#xff0c;我们以数组的形式传递3个3D坐标作为图形渲染管线的输入&#xff0c;用来表示一个三角形&#xff0c;这个数组叫做顶点数据(Vertex Data)。 顶点着色…

2001-2022年上市公司利润表数据

2001-2022年上市公司利润表数据 1、时间&#xff1a;2001.12.31-2022.12.31 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、统计截止日期、报表类型、投资收益、其中&#xff1a;对联营企业和合营企业的投资收益、公允价值变动收益、营业利润、其他综…

严刑拷打_微服务

文章详情 &#xff1a;&#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; 微服务相关知识 ⏱️ 创作时间&#xff1a;2024年03月8日 ———————————————— 文章目…

Redis核心数据结构之字典(二)

字典 解决键冲突 当有两个或以上数量的键被分配到了一个哈希表数组的同一个索引上面&#xff0c;我们称这些键发生了冲突(collision)。 Redis的哈希表使用链地址法(separate chaining)来解决键冲突&#xff0c;每个哈希表节点都有一个next指针&#xff0c;多个哈希表节点可以…

c++ 常用的STL

前言 写这篇博客目的是为了记录在刷算法题中使用过的STL&#xff0c;因为有些不太常用的会遗忘。这篇博客只是作为笔记&#xff0c;不是详细的STL&#xff0c;因此只会对常用方法说明&#xff0c;不会详细介绍。此外在后面用到新的STL内容时会再补充。 列队 基础列队 基本列…

社区店选址标准:如何选择适合你业务的理想位置

选址是实体店成功的关键因素之一&#xff0c;而社区店更是要紧密结合社区的特点来选择。 作为一名鲜奶吧开店5年的创业者&#xff0c;我将为大家分享一些实用的社区店选址标准。 1、社区类型&#xff1a; 首先要明确你的目标客户群体&#xff0c;然后选择与之匹配的社区类型…