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

    传送门

    普及组的题目……很水。

    原来写了一个模拟不过好像状态考虑的不全得了80,这次我们考虑一下dp做法。

    守卫者有两种移动的方法,一种是闪现,一种是跑,我们可以把闪现和跑分开处理。

    首先只处理闪现的情况,这个时候要用贪心,能闪就闪,否则原地回蓝即可。

    之后在处理跑步的情况,这种情况就要用dp了,方程很好推,就是dp[i] = max(dp[i],dp[i-1]+17)

    这样的做法为什么正确呢?因为其实我们跑步的时候只是会把原来只用闪现的情况中,有一些不够好的情况替换掉了,这样就能保证全部被考虑到。

    看一下代码。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #define rep(i,a,n) for(ll i = a;i <= n;i++)
    #define per(i,n,a) for(ll i = n;i >= a;i--)
    #define enter putchar('
    ')
    
    using namespace std;
    const int M = 300005;
    typedef long long ll;
    
    int read()
    {
        int ans = 0,op = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
            if(ch == '-') op = -1;
            ch = getchar();
        }
        while(ch >= '0' && ch <= '9')
        {
            ans *= 10;
            ans += ch - '0';
            ch = getchar();
        }
        return ans * op;
    }
    int m,s,t,dp[M];
    int main()
    {
        m = read(),s = read(),t = read();
        rep(i,1,t) 
        {
            if(m >= 10) m -= 10,dp[i] = dp[i-1] + 60;
            else dp[i] = dp[i-1],m += 4;
        }
        rep(i,1,t) 
        {
            dp[i] = max(dp[i],dp[i-1]+17);
            if(dp[i] >= s) 
            {
                printf("Yes
    %d
    ",i);
                return 0;
            }
        }
        printf("No
    %d
    ",dp[t]);
        return 0;
    }
  • 相关阅读:
    不要让生命的车轮停下,否则再次驱动需要更多的力气
    计算机英语
    知我者谓我心忧,不知我者谓我何求
    Poverty in USA and China
    [转]PCI配置空间简介
    基于OpenGL的起重机模拟
    OpenGL 彩色旋转立方体
    asp.net下载文件几种方式
    Jquery+$.cookie()实现跨越页面tabs导航
    简单自定义实现jQuery验证
  • 原文地址:https://www.cnblogs.com/captain1/p/9544653.html
Copyright © 2011-2022 走看看