[NOIp pj 2007][Luogu P1095] 守望者的逃离

一道简单的\(dp\)题,主要在于进行了\(2\)\(dp\)来解题

以时间为\(dp\)条件,路程为代价,\(dp[i]\)表示i时刻最远路程。

第一次只考虑使用闪现,第二次在闪现的基础上考虑奔跑。

#include

using namespace std;

inline int read() {
    int ans=0;
    char last = ' ',ch =getchar();
    while(ch>'9'||ch<'0') last=ch,ch=getchar();
    while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

int m,s,T;
int dp[300010];

int main() {
    m=read();
    s=read();
    T=read();
    for(int i=1;i<=T;i++) {
        if(m>=10) {
            dp[i]=dp[i-1]+60;
            m-=10;
        }
        else {
            dp[i]=dp[i-1];
            m+=4;
        }
    }
    for(int i=1;i<=T;i++) {
        dp[i]=max(dp[i],dp[i-1]+17);
        if(dp[i]>=s) {
            printf("Yes\n%d",i);
            return 0;
        }
    }
    printf("No\n%d",dp[T]);
    return 0;
}

你可能感兴趣的:([NOIp pj 2007][Luogu P1095] 守望者的逃离)