描述

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

    竞赛地址:https://ctf.isis.poly.edu/challenges/ 第一关:Trivia Trivia意思为琐事,每题分值50,比较简单 1.Drink all the booze, ...

  2. 100个高质量Java开发者博客

    ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博客,然后不段补充到这个列表.欢迎你也参与推荐优质的Java开发博客.(声明一下:我们的数学不是体育老师教的!:) ...

  3. Android java传递string类型数据给C

    本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ...

  4. Android 采用post方式提交数据到服务器

    接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout ...

  5. Cordoval在iOS中的运用整理

    一:关于Cordoval理论知识 1:PhoneGap是手机平台上流行的一款中间件.它构建在各种手机平台所提供的WebView(浏览器内核)组件的基础之上,使用javascript语言对应用开发者提供 ...

  6. 【原】你真的懂iOS的autorelease吗?

    或许这个题目起得有点太高调了,不过我只是想纠正一些童鞋对于autorelease的认识,如果能帮到几个人,那这篇文章也就值得了!当然,高手请绕道 本文主要探讨两个方面:(1)autorelease对象 ...

  7. Java for XML: JAXP、JAXB、JAXM、JAX-RPC、JAX-WS

    在XML领域里,对XML文件的校验有两种方式:DTD校验.Schema校验.在Java中,对于XML的解析,有多种方式:DOM解析.SAX解析.StAX解析.结合XML和Java后,就产生了Bind技 ...

  8. org.apache.jasper.JasperException: Unable to compile class for JSP

    项目启动时报错 : The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory S ...

  9. Linux下GitLab的快速安装以及备份

    源码安装 GitLab 步骤繁琐:需要安装依赖包,Mysql,Redis,Postfix,Ruby,Nginx……安装完毕还得一个个手动配置这些软件,容易出错 一.安装 在Ubuntu 14上 修改/ ...

  10. SQL Server 2008 R2——创建函数 筛选出字符串中的数字 筛选出字符串中的非数字

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...