2007 守望者的逃离(线性dp)

本文介绍了一种游戏竞赛中的编程策略,通过使用技能和跑步插缝的方法来最大化角色的移动距离。详细解释了如何在每秒内计算角色可以达到的最大位置,并通过算法优化,确保在有限时间内达到目标距离。

链接:https://ac.nowcoder.com/acm/contest/235/C
f[i] 表示在第i秒能跑到多远,先算出只放技能每秒能跑多远,再用跑步的方式“插缝”,即f[i] = max(f[i],f[i-1]-17) ;

#include <cstdio>
#include <algorithm>
using namespace std ;
const int N = 300005 ;
int f[N] ;
int main(){
    int m , s , t ;
    scanf ("%d%d%d",&m,&s,&t) ;
    for (int i = 1 ; i <= t ; i ++){
        if(m >= 10){
            f[i] = f[i-1] + 60 ;
            m -= 10 ;
        }
        else{
            f[i] = f[i-1] ;
            m += 4 ;
        }
    }
    for (int i = 1 ; i <= t ; i ++){
        f[i] = max(f[i],f[i-1]+17) ;
    }
    bool flag = false ;
    for (int i = 1 ; i <= t ; i ++){
        if (f[i] >= s){
            flag = true ;
            printf ("Yes\n%d\n",i) ;
            break ;
        }
    }
    if (!flag)    {
        printf ("No\n%d\n",f[t]) ;
    }
    return 0 ;
}
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
### P1095 守望者逃离 Java 实现 #### 问题描述 守望者被围困在一个即将沉没的荒岛上,需要尽快逃离。给定守望者的魔法初值 \( M \),初始位置与岛的出口之间的距离 \( S \),以及岛沉没的时间 \( T \)守望者可以通过跑步、闪烁或休息来行动,每种活动都以秒为单位。 - 跑步速度:17 m/s - 闪烁法术:可以在1 s内移动60 m,消耗魔法值10点 - 魔法恢复速率:4点/s(仅在静止状态下) 目标是在最短时间内逃离岛屿;如果无法逃脱,则计算守望者能够行走的最大距离[^2]。 #### 解决思路 该问题是典型的动态规划 (Dynamic Programming, DP) 类型题目。通过构建二维数组 `dp[i][j]` 来表示第 i 秒时剩余 j 点魔力的情况下所能达到的最大位移量。对于每一时刻的状态转移方程如下: - 如果选择跑动,则下一状态为 dp\[i+1\]\[j\]=max(dp\[i+1\]\[j\],dp\[i\]\[j\]+17); - 若决定瞬移,则更新规则变为 dp\[i+1\]\[j−10\]=max(dp\[i+1\]\[j−10\],dp\[i\]\[j\]+60),前提是当前魔力不少于10; - 当处于休憩模式下,魔力逐渐回复至上限但不超出原有数值,即 dp\[i+1\]\[min(j+4,M)\]=max(dp\[i+1\]\[min(j+4,M)\],dp\[i\]\[j\]). 最终解应取自所有可能终态中的最大值作为答案返回。 #### Java代码实现 ```java import java.util.Scanner; public class Escape { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int M = scanner.nextInt(); // 初始魔力值 int S = scanner.nextInt(); // 出口的距离 int T = scanner.nextInt(); // 岛屿下沉时间 final int RUN_SPEED = 17; // 跑步速度 final int TELEPORT_DISTANCE = 60; // 传送距离 final int MAGIC_COST_TELEPORT = 10; // 使用一次传送所需的魔力 final int MAGIC_RECOVER_RATE = 4; // 每秒钟恢复的魔力量 boolean canEscape = false; int maxDistanceCovered = 0; // 动态规划表初始化 int[][] dp = new int[T + 1][M + 1]; for(int t=0;t<=T;++t){ for(int magicLeft=0;magicLeft<=Math.min(M,t*MAGIC_RECOVER_RATE);++magicLeft){ if(t>0 && magicLeft>=MAGIC_COST_TELEPORT){ dp[t][magicLeft-MAGIC_COST_TELEPORT] = Math.max( dp[t][magicLeft-MAGIC_COST_TELEPORT], dp[t-1][magicLeft] + TELEPORT_DISTANCE ); } if(t>0){ dp[t][magicLeft] = Math.max( dp[t][magicLeft], dp[t-1][magicLeft] + RUN_SPEED ); if(magicLeft<M){ dp[t][magicLeft+MAGIC_RECOVER_RATE] = Math.max( dp[t][magicLeft+MAGIC_RECOVER_RATE], dp[t-1][magicLeft] ); } } if(!canEscape && dp[t][magicLeft]>=S){ System.out.println("可以成功逃跑"); canEscape=true; }else{ maxDistanceCovered=Math.max(maxDistanceCovered,dp[t][magicLeft]); } } } if (!canEscape) { System.out.printf("无法逃生,在规定时间内可前进的最大距离:%d 米\n", maxDistanceCovered); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值