P1095 [NOIP2007 普及组] 守望者的逃离(线性dp)

传送门

题意:给我们剩余的时间,路程,和能量,问我们是否能在规定时间内到达目的地,能到达输出最短时间,不能到达输出能到达的最远位置,

每秒我们有三种选择,一种是传送60米,但是要消耗10能量.一种是跑17米,无消耗,另一种是选择休息,回复4能量,

思路:传送虽然要消耗能量,但是就算是0能量开始等待再传送也比直接跑步快,所以传送是第一选择,我们先计算出能传送的最大距离,

然后再计算剩余时间跑步是否能到,不能到就输出no与最远距离,如果能到,就要计算最后一次传送是否跑步会更快,再去判断

这题有一种优秀解法就是;用两个变量s1,s2分别表示跑步和传送在某一时刻能到达的最远距离,如果传送的距离大于了跑步的距离,就把跑步距离

更新为传送距离,这样就能比较轻松得到上面那种方法的其余需要判断的情况,非常方便

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
    int m, s, t;
    scanf("%d%d%d", &m, &s, &t);
    int s1 = 0,s2=0;
    for (int i = 1; i <= t; i++) {
        s2 += 17;
        if (m >= 10) {
            s1 += 60;m -= 10;
        }
        else m += 4;
        if (s1 > s2)s2 = s1;//更新为传送
        if (s2 >=s) {
            printf("Yes\n");
            printf("%d\n", i);
            return 0;
        }
    }
    printf("No\n");
    printf("%d\n", s2);
    return 0;
}

 

posted @ 2021-03-20 19:14  cono奇犽哒  阅读(74)  评论(0)    收藏  举报