• YCOJ黑熊过河


    Description

    有一只黑熊想过河,但河很宽,黑熊不会游泳,只能借助河面上的石墩跳过去,他可以一次跳一墩,也可以一次跳两墩,但是每起跳一次都会耗费一定的能量,黑熊最终可能因能量不够而掉入水中,所幸的事,有些石墩上放了一些食物,这些食物可以给黑熊增加一定的能量,问黑熊能否利用这些石墩安全的抵达对岸,若能,则计算出抵达对岸后剩余能量的最大值是多少?


    Input

    第一行包含两个整数P(黑熊的初始能量),Q(黑熊每次起跳时耗费的能量),(0≤P,Q≤1000);

    第二行只有一个整数N(1≤N≤10^610
    6
    ),即河中石墩的数目;

    第三行有N个整数,即每个石墩上食物的能量值ai(0≤ai≤1000)。


    Output

    输出文件包括一行,若黑熊能抵达对岸,输出抵达对岸后剩余能量的最大值是多少,若不能抵达对岸,则输出“NO”。


    Sample Input 1

    12 5
    5
    0 5 2 0 7
    Sample Output 1

    6

    明眼人们一眼就可以看出这道题是一道DP,可如果只能走1步,那么这道题会简单许多,但为了拦住OIer们,他偏偏可以走1步或两步。


    算了算了,含着泪也要写这道题。
    那现在该怎么办呢?
    那我们先来画个图理解一下吧。

    这样看起来,这题感觉也不是很难,但要注意的是,中途熊的能量是可能小于0的,所以那是后就要给dp[i][j]赋一个极小值,不然中途又吃活了怎么办?

    源代码(附赠注释):

    #include <bits/stdc++.h>
    using namespace std;
    int dp[10010],a[10010];
    int main(){
    int p,q;
    cin>>p>>q;
    int n;
    cin>>n;
    for (int i=1;i<=n;i++){
    cin >>dp[i];
    }//输入 
    dp[0]=p;
    dp[1]+=dp[0]-q;
    if (dp[1]<=0){
    cout<<"NO";
    return 0;
    }//如果开头都跳不过去,就直接return。 
    for (int i=2;i<=n+1;i++){
    bool sb=0;//一个普通的变量 
    if(dp[i-1]-q>=0){
    sb=1;
    }
    if(dp[i-2]-q>=0){
    sb=1;
    }
    if (sb){
    dp[i]+=max(dp[i-1],dp[i-2]-q);
    if (dp[i]<=0){
    dp[i]=-1e9;
    }//如果它掉到水里去了,就赋一个极小值,不能让他吃诈尸了。 
    }else{
    dp[i]=-1e9;//走一步和走两步都会掉到水里,那就不玩了呗 
    }
    }
    dp[n]-=q;
    if (dp[n+1]<=0){
    cout<<"No";
    }else{
    cout<<dp[n];
    }//判断一下,可怜的熊是否还活着 
    
    return 0;
    }

    标准结局:

  • 相关阅读:
    杭电acm1517
    杭电acm1228
    杭电acm1859
    杭电acm1124
    杭电acm1327
    CPP Templates 之 template 关键字的用法技巧
    malloc与calloc区别
    CPP Templates 之 类模板的继承
    CPP Templates 之 模板演绎的注意事项
    CPP Templates 之 局部类模板特化
  • 原文地址:https://www.cnblogs.com/herobrine-life/p/10959713.html
Copyright © 2020-2023  润新知