zoukankan      html  css  js  c++  java
  • 守望者的逃离

    描述

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

      贪心:用魔法的次数来更新ANS,从0次到T次,注意边界的判断,保证严密性。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<cstring>
     7 using namespace std;
     8 int M,S,T;
     9 int ANS=1e9;
    10 int MOVE;
    11 int main(){
    12     
    13     scanf("%d%d%d",&M,&S,&T);
    14     for(int i=0;i<=T;i++){//最多使用 i次魔法 
    15         int tim=i;
    16         int move=60*i;
    17         int tot=10*i;//需要的魔法点数 
    18         if(tot>M){//计算需要休息的时间 
    19             int delta=tot-M;
    20             int x1=delta/4;
    21             if(delta%4!=0)
    22                 x1++;
    23             tim+=x1;
    24         }
    25         if(tim<=T&&move>=S){//只用魔法可以到达 
    26             ANS=min(ANS,tim);
    27             MOVE=max(MOVE,S);
    28             continue;
    29         }
    30         else if(tim>T){//此句很重要
    31             continue;
    32         }
    33         
    34         int s=S-move;//需要走的路程
    35         int t1=s/17;
    36         if(s%17!=0)
    37             t1++;
    38         tim+=t1;
    39         if(tim<=T){
    40             ANS=min(ANS,tim);
    41             MOVE=max(MOVE,S);
    42             continue;
    43         }
    44         else{
    45             int t2=T-(tim-t1);
    46             move+=t2*17;
    47             MOVE=max(MOVE,move);
    48         }
    49     }
    50     
    51     if(MOVE<S){
    52         cout<<"No"<<endl;
    53         cout<<MOVE<<endl;
    54     }
    55     else{
    56         cout<<"Yes"<<endl;
    57         cout<<ANS<<endl;
    58     }
    59     return 0;
    60 }
  • 相关阅读:
    SQL反模式学习笔记16 使用随机数排序
    SQL反模式学习笔记21 SQL注入
    SQL反模式学习笔记22 伪键洁癖,整理数据
    SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
    SQL反模式学习笔记19 使用*号,隐式的列
    SQL反模式学习笔记17 全文搜索
    SQL反模式学习笔记20 明文密码
    (可发送)亿级流量APP,是怎么做前端性能测试自动化的?
    测试窝 高薪测试必备技能和 20+ 项目实战精华,好书免费领(限前 1000 名)!
    同样是断言,为何 Hamcrest 如此优秀?测试灵魂三问,该如何回答?
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4839100.html
Copyright © 2011-2022 走看看