一题多解之守望者逃离

本文探讨了P1095 [NOIP2007 普及组] 守望者的逃离问题的解法,包括二维DP和贪心策略。在分析题目后,提出一个贪心思路:魔法值足够时优先使用闪避。二维DP状态转移方程考虑了不同魔法值下的最大逃跑距离,而一维DP侧重于在每秒能通过的最大距离。贪心做法则注重代码实现中的细节策略。
摘要由CSDN通过智能技术生成

P1095 [NOIP2007 普及组] 守望者的逃离

此题有较为多种解法:DP,贪心,数学解法

本文章只介绍其中的两种DP做法和贪心做法

分析:

阅读题目,有一个小贪心:就是魔法值足够的时候能闪则闪。

于是乎,不管是哪一种方法,首先都要算闪,就是闪光为止。

解法一:二维DP

设计这样一个状态:f[i][j]表示i秒后,拥有j点魔法值,可以跑出的最大距离。

当我们把闪的处理好以后,剩下的魔法值不能闪了,最多也就是9,再加上原地回蓝+4,一共是13,这就意味着f[i][j]的j不用太大,15即可。

//状态转移方程并非难事
f[i][j]=max(f[i-1][j]+17,f[i][j]);

if(j>=4)
  f[i][j]=max(f[i-1][j-4],f[i][j]);
if(j<4)
  f[i][j]=max(f[i-1][j+10]+60,f[i][j]);

解法二:一维DP

用f[i]表示,第i秒能通过的最大距离

一共只有三种走法:原地回蓝,闪60米,跑17米。先处理前两种,遵循能闪就闪的原则

代码非常好懂

#include <bits/stdc++.h>
using namespace std
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于守望者逃离这道题目,可以使用动态规划或贪心算法来解决。首先我们需要理解题目的要求,甲在光明大道的起始点,每秒有三种选择:1.行使17m,2.在蓝量足够的情况下行使60m,蓝量减去10,3.行使0m,恢复4蓝量。我们需要判断甲能否在初始蓝量为m的情况下在t秒内到达终点。 为了解决这个问题,我们可以使用一个循环来模拟每一分钟的情况。假设甲在当前的时间点有一定的蓝量,我们可以计算出他在下一分钟时的蓝量,并根据这个蓝量来判断他的行动选择。如果蓝量足够,我们选择行使60m并减去10的蓝量;如果蓝量不足,我们选择行使17m;如果蓝量为0,我们选择恢复4蓝量。 在每一分钟的计算中,我们需要对甲的位置进行更新,并记录下他到达终点的最短时间。当循环结束后,我们可以得到甲是否能在规定时间内到达终点,如果能,输出"Yes"并换行输出所需时间;如果不能,输出"No"并换行输出甲最长能达到的距离。 这样,我们就可以使用C语言编写代码来解决守望者逃离这道题目了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[NOIP2007 普及组] 守望者逃离](https://blog.csdn.net/TGxyt_blog/article/details/122783995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值