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; }