描述

恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者
在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这
个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为
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. [Android]使用Kotlin+Anko开发Android(一)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4800656.html  Kotlin是由JetBrains开发 ...

  2. UIButton的titleEdgeInsets属性和imageEdgeInsets属性实现图片文字按要求排列

    button可以设置 titleEdgeInsets属性和 imageEdgeInsets属性来调整其image和label相对位置,具体参考http://stackoverflow.com/ques ...

  3. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  4. 初学Spring有没有适合的书

    初学者之前没有阅读java框架源码的习惯.没有阅读过源码,知道整体流程么?知道依赖注入的概念么?知道aop么?知道其中用到了哪些设计模式么?再说了,如果一上手就是源码?难道你没有注意到Spring的类 ...

  5. mac ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib /mysql/mysql.sock' (111)

    之前装了mysql,今天打开mysql的时候报了个Can't connect to local MySQL server through socket '/var/lib /mysql/mysql.s ...

  6. socket编程listen函数限制连接数的解决方案

    函数原型: int listen(int sockfd, int backlog); 当服务器编程时,经常需要限制客户端的连接个数,下面为问题分析以及解决办法: 下面只讨论TCP  UDP不做讨论(很 ...

  7. TinyFox v2.3.2 正式发布,跨平台的.NET OWIN WEB服务器

    TinyFox 是一款按照 OWIN 协议开发的以支持各类 OWIN 应用为主要特征的高性能 WEB 服务器,2.3.2版已经正式发布,下载地址 http://www.linuxdot.net/.   ...

  8. CocoaPods安装以及相关问题解决

    Mac OS X上安装 Ruby环境 安装RVM $ curl -L https://get.rvm.io | bash -s stable 关闭终端,新开另外一个终端(新打开的终端会自动载入RVM环 ...

  9. JavaScript Patterns 6.2 Expected Outcome When Using Classical Inheritance

    // the parent constructor function Parent(name) { this.name = name || 'Adam'; } // adding functional ...

  10. Sql Server之旅——第五站 确实不得不说的DBCC命令(文后附年会福利)

    今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ceo从美国带了干红回来,然后我就顺道开心的过了把瘾....一个字.. ...