蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

题目链接:

1.蜗牛 - 蓝桥云课 (lanqiao.cn)

思路说明:

首先,考虑DFS暴力解:对于蜗牛来说,它出发的起点可能是:

1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi,

那么他有三种方式走,

  1. 从Xi竹竿底部沿着x轴爬过去到Xi+1
  2. 从bi向上或者向下爬到ai,通过传送门到达下一根竿,也就是(xi+1,bi+1)
  3.  从bi直接滑到当前竹竿底部

这就形成了dfs三个递归搜索的分支,终止条件是到达目标点,剪枝函数是所用时间大于已经找到的最小时间(初始值设置为原点到目标点的x差值)时,返回。

需要参数保存当前的x,y坐标,当前已经花了的时间,因为竹竿和传送门保存在数组里,我们需要传递索引来确定走到哪一根竹竿了。

注意:结果要保留两位小数,可以使用c语言的格式控制。

每个dfs的条件(见程序),最后一根竿是没有传送门的,所以最后一根杆不能走传送门 的dfs,要进行判断。

还有从第一根竿开始,最后结果还要加上原点到第一根竿的时间。

DFS代码如下:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int ans = 0;
vector<int> x;
vector<int> a,b;
int n=0;
double mint=0;
void dfs(int cx,int cy,double t,int i){if(t>mint)  return;if(cx==x[n]&&cy==0){if(t<mint){mint=t;}return;}/*	错误代码:在选择爬到该杆子的a[i]使用魔法时,没有考虑到用魔法跳到下一根杆子的时候,不是从0往上爬,而是根据跳到的bi+1(cy)与ai+1的相对位置决定向上 还是 向下爬 ,爬的距离是cy和ai+1的相对距离 if(cy==0) dfs(x[i+1],b[i+1],t+a[i]/0.7,i+1);if(cy==0) dfs(x[i+1],0,t+(x[i+1]-x[i]),i+1);	if(cy>0) dfs(x[i],0,t+cy/1.3,i);*///注意 if(cy>=a[i]&&cx!=x[n]) dfs(x[i+1],b[i+1],t+(cy-a[i])/1.3,i+1);if(cy<a[i]&&cx!=x[n])  dfs(x[i+1],b[i+1],t+(a[i]-cy)/0.7,i+1);if(cy>0)  dfs(x[i],0,t+cy/1.3,i);if(cy==0&&cx!=x[n]) dfs(x[i+1],0,t+(x[i+1]-x[i]),i+1);	
}signed main() {cin.tie(0);cout.tie(0);cin>>n;x.push_back(0);a.push_back(0);b.push_back(0);b.push_back(0);for(int i=1;i<=n;i++){int xi;cin>>xi;x.push_back(xi);}for(int i=1;i<=n-1;i++){int ai,bj;cin>>ai>>bj;a.push_back(ai);b.push_back(bj);}mint=x[n]-x[1];dfs(x[1],0,0,1);printf("%.2f",mint+x[1]);return 0;
}

在比赛中,首先要保证暴力做出来拿到一些分数,再考虑优化。由于n的数据范围到达了10^{5}

所以肯定是会超时的,时间复杂度O(3^{n})。于是考虑动态规划。

//怎么比较自然地想到动态规划的解决方式: 
//考虑达到终点即xn竹竿的底部(xn,0)的方式,可以从 (Xn-1,0)沿着x轴爬过去,或者从(Xn-1 ,a[n-1])
//通过传送门到达(Xn ,b[n]) , 再从这个地方顺着竹竿下滑到达 (xn,0)
//如果只使用一个dp数组保存到达xi竹竿底部的最短时间,我们无法计算出到达xi+1底部的最短时间
//因为无法确认求出来的当前最短时间是否是从传送门终点滑下来的还是从上一个竹竿沿着x轴爬过来的   
//所以还需要一个dp数组来保存到达每根竹竿的传送门起点的最短时间 

//这提示我们,线性的动态规划可能需要不止一个dp数组来递推,根据需要来设计 

关于递推公式,网上题解已经足够丰富,不再赘述。

代码如下:

//#include<iostream>
//#include<queue>
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e5+10;
int ans = 0;
vector<int> x;
vector<int> a,b;
int n=0;
//double mint=0;
double bottom[N],tran[N];//怎么比较自然地想到动态规划的解决方式: 
//考虑达到终点即xn竹竿的底部(xn,0)的方式,可以从 (Xn-1,0)沿着x轴爬过去,或者从(Xn-1 ,a[n-1])
//通过传送门到达(Xn ,b[n]) , 再从这个地方顺着竹竿下滑到达 (xn,0)
//如果只使用一个dp数组保存到达xi竹竿底部的最短时间,我们无法计算出到达xi+1底部的最短时间
//因为无法确认求出来的当前最短时间是否是从传送门终点滑下来的还是从上一个竹竿沿着x轴爬过来的   
//所以还需要一个dp数组来保存到达每根竹竿的传送门起点的最短时间 //这提示我们,线性的动态规划可能需要不止一个dp数组来递推,根据需要来设计 signed main() {cin.tie(0);cout.tie(0);cin>>n;x.push_back(0);a.push_back(0);b.push_back(0);b.push_back(0);for(int i=1;i<=n;i++){int xi;cin>>xi;x.push_back(xi);}for(int i=1;i<=n-1;i++){int ai,bj;cin>>ai>>bj;a.push_back(ai);b.push_back(bj);}bottom[1]=x[1],tran[1]=x[1]+a[1]/0.7;for(int i=2;i<=n;i++){bottom[i]=min(bottom[i-1]+x[i]-x[i-1],tran[i-1]+b[i]/1.3);double dis=0;if(b[i]>=a[i])  dis=(b[i]-a[i])/1.3;else dis=(a[i]-b[i])/0.7;tran[i]=min(bottom[i-1]+x[i]-x[i-1]+a[i]/0.7,tran[i-1]+dis);}//保留两位小数 printf("%.2f",bottom[n]);return 0;
}

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

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

相关文章

JS08-DOM节点完整版

DOM节点 查找节点 父节点 <div class="father"><div class="son">儿子</div></div><script>let son = document.querySelector(.son)console.log(son.parentNode);son.parentNode.style.display = none</script>通过…

2024年阿里云2核4G服务器价格30元、165元和199元1年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

babel主要内容

定义 babel是一个编译工具 &#xff0c;用于把JSX等编译成浏览器可执行的javascript。 主要内容是几个包babel/parser 这个包主要是用于解析代码到AST树babel/types 这个包中有一堆API&#xff0c;用于手动创建ASTbabel/traverse 这个包主要是为了遍历AST树&#xff0c;结合具体…

Python计算机二级选择易错题(二)

选择题第07&#xff0c;05&#xff0c;01套 题目来源&#xff1a;python计算机二级真题&#xff08;选择题&#xff09; - 知乎 选择题第07套 选择题第05套 选择题第01套 ​​​​ s.index(x)或s.index(x,i,j)返回序列s从i开始到j位置中第一次出现元素x的位置 ​​​​​​

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据 1、时间&#xff1a;2001-2023年 2、范围&#xff1a;300个地级市&#xff08;包括直辖市&#xff09; 3、来源&#xff1a;历年中国铁道出版社出版的《全国铁路旅客列车时刻表》 4、用途&#xff1a;高铁开通可作…

Unity---Lua语言

Lua Binaries Download 13.2 逻辑热更新——Lua1-3_哔哩哔哩_bilibili nil表示空 只有false和nil为false&#xff0c;其他值都为true ..连接两个字符串

java 泛型(下)

本篇文章主要说明的是类型通配符、可变参数、可变参数的使用等。 在学习之前&#xff0c;希望能对泛型有个大概了解&#xff0c;可参考链接 java 泛型&#xff08;上&#xff09;-CSDN博客 也希望对泛型类、泛型接口、泛型方法有个大概的认识及使用&#xff0c;可参考链接 j…

什么是485数据采集模块?

在工业自动化、智能楼宇、环境监测等众多领域&#xff0c;数据的采集与传输是实现智能化管理的关键。而485数据采集模块&#xff0c;作为一种高效、稳定的数据采集设备&#xff0c;正日益受到广泛关注。HiWoo Box&#xff0c;作为一款卓越的485数据采集模块&#xff0c;以其强大…

Maven 环境一键部署

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Penpad 生态资产 $PDD 即将LaunchPad ,一文读懂Season 2 规则

Penpad 是 Scroll 上的 LauncPad 平台&#xff0c;该平台继承了 Scroll 底层的技术优势&#xff0c;并基于零知识证明技术&#xff0c;推出了系列功能包括账户抽象化、灵活的挖矿功能&#xff0c;并将在未来实现合规为 RWA 等资产登录 Scroll 生态构建基础。该平台被认为是绝大…

C++概述

目录 一、C关键字&#xff08;63个&#xff09; 二、C几个关键点&#xff1a; 三、C语言缺陷一&#xff1a;命名冲突 四、C新概念&#xff1a;命名空间&#xff08;namespace&#xff09; 五、命名空间的嵌套&#xff1a; 六、展开命名空间&#xff1a;&#xff08;using …

独家,澳门地区倾斜摄影OSGB数据免费领取

上一篇文章分享了如何将谷歌倾斜摄影原始数据如何转换成3DTiles的几种思路&#xff0c;并说明谷歌倾斜摄影3DTiles转换工具的技术先进性&#xff0c;同时也对谷歌倾斜摄影转换OSGB的几种技术思路做了对比&#xff0c;根据对比可知&#xff0c;谷歌倾斜摄影OSGB转换工具在生产效…

【No.14】蓝桥杯贪心法|最少硬币问题|活动安排问题(4)|翻硬币|快乐司机|防御力|答疑(C++)

算法优点 容易理解&#xff1a;生活常见 操作简单&#xff1a;在每一步都选局部最优 效率高&#xff1a;复杂度常常是O(1)的 算法缺点 局部最优不一定是全局最优 贪心算法&#xff08;Greedy algorithm&#xff09;&#xff0c;又称贪婪算法。是一种在每一步选择中都采取在…

小红书离线数仓提效新思路,提升百倍回刷性能

数据处理效率一直是大数据时代的核心话题&#xff0c;它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce&#xff0c;到今天的 Spark&#xff0c;各行业正不断演进其离线数仓技术架构。 现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展&#xff0c;…

(vue)el-card区分背景图片、点击进入对应页面

(vue)el-card区分背景图片、点击进入对应页面 项目背景&#xff1a;郑州院XX项目首页-工作台模块卡片点击可 快速进入对应页面 html <div class"board-card"><el-cardv-for"(item, index) of cardList":key"index"class"board-ca…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…

[Linux]条件变量:实现线程同步(什么是条件变量、为什么需要条件变量,怎么使用条件变量(接口)、例子,代码演示(生产者消费者模式))

目录 一、条件变量 1.什么是条件变量 故事说明 2、为什么需要使用条件变量 竞态条件 3.什么是同步 饥饿问题 二、条件变量的接口 1.pthread_cond_t 2.初始化&#xff08;pthread_cond_init&#xff09; 3.销毁&#xff08;pthread_cond_destroy&#xff09; 4.等待&…

阿里云2核4G服务器租用价格和性能测评

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677&#xff0c;自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹&#xff0c;然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

如何使用人工智能和ChatGPT来优化营销转化率

人工智能 &#xff08;AI&#xff09; 和营销的交集正在彻底改变企业与客户互动的方式&#xff0c;最终改变营销转化率。人工智能能够分析大量数据、理解模式和自动执行任务&#xff0c;它不仅是一项创新技术&#xff0c;而且是营销领域的根本性转变。这种转变允许更加个性化、…