描述

恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者
在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这
个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为
17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不
过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地
休息状态时才能恢复。
现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。

你的任务写写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望
者在剩下的时间能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每
次活动的持续时间为整数秒。距离的单位为米(m)。

格式

输入格式

在输入文件escape.in仅一行,包括空格隔开的三个非负整数M,S,T。

输出格式

在输出文件escape.out包括两行:
第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。
第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;
第一行为“No”(区分大小写)时表示守望者能走的最远距离。

样例1

样例输入1[复制]

39 200 4

样例输出1[复制]

No
197

样例2

样例输入2[复制]

36 255 10

样例输出2[复制]

Yes
6

限制

1s

提示

30%的数据满足:1<=T<=10,1<=S<=100
50%的数据满足:1<=T<=1000,1<=S<=10000
100%的数据满足:1<=T<=300000,0<=M<=1000,1<=S<=10^8

来源

NOIP2007普及组第3题

Accepted

 
100
0 7556 ksq2013 C++ 2016-08-16 23:04:32

思路1:暴搜

dfs(t,s,m)
if s>=S then write(yes) AND exit(0)
if t>T then record(s)
if m>=10 then dfs(t+1,s+60,m-10)
else dfs(t+1,s,m+4)
dfs(t+1,s+17,m)

思路2:没有正确性证明的贪心

greedy()
for i->1 to T
if M>=10 then s->s+60 AND M->M-10
else
if ((10-M)/4+1)*17>60 then s->s+17
else i->i+4 AND M->(10-M)/4*4-10+M AND s->s+60

思路3:背包动规

晕倒。一开始思路被纯粹的背包思路和背包写法给圈死了,记忆化搜索||递推想出的solution中的状态基本都处理不好后效性问题,

例如:将暴搜的顺序思路进行到底,得出f[t][m]=max{f[t-1][m+4],f[t-1][m-10]+60,f[t-1][m]+17}

几小时的苦思冥想最后看了标程。

其实我最初的思路已经有了一定的框架,只不过没有跳出自己划的“圈圈”

正解:观察题目,试举出几个例子,可以发现,同一初始魔法值的情况下,任何时刻都有属于它本身独立的最优解,“最优解”即最远距离咯。

而当前若选择行走,得到的总路程仅与与上一时刻的最优解有关;

当前若选择用魔法,得到的总路程仅与上一时刻的魔法值和上一时刻用魔法走出的距离有关系(因为对于之后的某些特定时刻,不断停下蓄魔法槽比不断行走更优,因为不管怎样,最贪心的想法就是用完魔法值后不断行走)

所以,我们得出了解决方案:

f1[i]=f1[i-1]+60 AND M-=10    or    f1[i]=f1[i-1] AND M+=4

f2[i]=max{f1[i],f2[i-1]+17}

程序如下:

Accepted

 
100
0 7556 ksq2013 C++ 2016-08-16 23:04:32
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef long long ll;
inline ll mx(ll x,ll y)
{
if(x>y)return x;
return y;
}
ll M,S,T;
struct state{ll dis,magic,ans;}f[300001];
int main()
{
scanf("%lld%lld%lld",&M,&S,&T);
f[0].dis=0,f[0].magic=M,f[0].ans=0;
for(int i=1;i<=T;i++){
f[i].magic=f[i].dis=f[i].ans=0;
if(f[i-1].magic>=10){
f[i].magic=f[i-1].magic-10;
f[i].dis=f[i-1].dis+60;
}
else{
f[i].magic=f[i-1].magic+4;
f[i].dis=f[i-1].dis;
}
f[i].ans=mx(f[i-1].ans+17,f[i].dis);
if(f[i].ans>=S){
printf("Yes\n%d\n",i);
return 0;
}
}
printf("No\n%lld\n",f[T].ans);
return 0;
}

vijos1431[noip2007]守望者的逃离(背包动规)的更多相关文章

  1. NOIP2007 守望者的逃离-DP

    https://vijos.org/p/1431 描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守 ...

  2. 【BZOJ2287】【POJ Challenge】消失之物 背包动规

    [BZOJ2287][POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了 ...

  3. - > 动规讲解基础讲解一——01背包(模板)

    作为动态规划的基础,01背包的思想在许多动规问题中会经常出现,so,熟练的掌握01背包的思路是极其重要的: 有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重 ...

  4. NOIP2013 提高组day2 2 花匠 动规 找拐点 树状数组

    花匠 描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体 ...

  5. 区间型动规--石子归并(Pascal)

    题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...

  6. 【noip 2009】 乌龟棋 记忆化搜索&动规

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  7. XJOI1571爱心蜗牛【树形动规】

    爱心蜗牛 猫猫把嘴伸进池子里,正准备"吸"鱼吃,却听到门铃响了.猫猫擦了擦脸上的水,打开门一看,那人正是她的好朋友--川川.川川手里拿着一辆玩具汽车,对猫猫说:"这是我的 ...

  8. XJOI1657&Codevs1255搭积木【树状动规】

    搭积木 一种积木搭建方式,高为H的积木,最底层有M个积木,每一层的积木数是他的低一层的积木数+1或-1.总共有N个积木.(且每行积木数不超过10)比如上图N=13 H=6 M=2. 输入格式: 第一行 ...

  9. noip普及组2007 守望者的逃离

    守望者的逃离 描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座 ...

随机推荐

  1. 1分钟实现Autodesk Vault登录对话框

      .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courie ...

  2. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  3. 操作系统开发系列—13.e.三进程

    我们再来添加一个任务,首先添加一个进程体: void TestC() { int i = 0x2000; while(1){ disp_str("C"); disp_int(i++ ...

  4. 浅谈GridLayout(网格布局)

    Android 4.0 布局-->GridLayout 网格布局 以行列单元格的形式展示内部控件排列,可以实现类似计算机键盘效果 ,也可以实现可自动变行的标签群效果 使用GridLayout , ...

  5. [Android]proguard重新编译和如何不混淆第三方jar包

    转载自:http://glblong.blog.51cto.com/3058613/1536516 一.ant安装.环境变量配置及验证 (一)安装ant 到官方主页http://ant.apache. ...

  6. JavaScript Patterns 5.1 Namespace Pattern

    global namespace object // global object var MYAPP = {}; // constructors MYAPP.Parent = function() { ...

  7. WebApi深入学习--概述+路由查找

    如何创建Controller这里就不说了,只写一些可能是高阶知识的内容 关于WebApi的官方介绍及示例 http://www.asp.net/web-api/ 1.跨域 Asp.NET有专门的跨域扩 ...

  8. 解决SecureCRT中文编码乱码

    1.mysql表和列都已经设置UTF-8了,然后还是不能输入中文和中文显示乱码. 2.在SecureCRT下: 执行英文设置:export LANG=zh_CN.UTF-8后不能直接输入中文. 然后执 ...

  9. 不要轻易使用linq代替sql

    使用Entityframework+Reposity模式 写出的代码执行效率极低. Linq代码: var querySql = rel_project_personservice.GetItems( ...

  10. HTTP状态码分类说明

    状态码分类 HTTP状态码被分为五大类, 目前我们使用的HTTP协议版本是1.1, 支持以下的状态码.随着协议的发展,HTTP规范中会定义更多的状态码. 小技巧:  假如你看到一个状态码518, 你并 ...