zoukankan      html  css  js  c++  java
  • P1877 [HAOI2012]音量调节

    题目描述

    一个吉他手准备参加一场演出。他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量。在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少。每一次改变音量,他可以选择调高也可以调低。

    音量用一个整数描述。输入文件中整数beginLevel,代表吉他刚开始的音量,整数maxLevel,代表吉他的最大音量。音量不能小于0也不能大于maxLevel。输入中还给定了n个整数c1,c2,c3,...,cn,表示在第i首歌开始之前吉他手想要改变的音量是多少。

    吉他手想以最大的音量演奏最后一首歌,你的任务是找到这个最大音量是多少。

    输入输出格式

    输入格式:

    第一行依次为三个整数n, beginLevel, maxLevel。

    第二行依次为n个整数 c1,c2,c3,...,cn。

    数据规模:

    1<=n<=50, 1<=ci<=maxLevel, 1<=maxLevel<=1000, 0<=beginLevel<=maxLevel

    输出格式:

    输出演奏最后一首歌的最大音量。如果吉他手无法避免音量低于0或者高于maxLevel,输出-1。

    输入输出样例

    输入样例#1: 
    3 5 10
    5 3 7
    
    输出样例#1: 
    10

    Solution:

      写写水题的博客,刷刷博客量~~嘿嘿嘿~~

      这是一次考试的防爆$0$的$DP$题目,$5min$钟就能刚完。

      定义状态$f[i][j]$表示到了第$j$次操作,能否达到$i$的音量。初始状态$f[st][0]=1$

      状态转移方程显而易见:$if(f[i][j-1]==1)f[i+a[j]][j]=f[i-a[j]][j]=1$

      然后倒序找满足$f[i][n]==1$的最大的$i$。

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
    using namespace std;
    const int N=2005;
    ll n,st,ed,a[N],f[N][55];
    int main(){
        scanf("%lld%lld%lld",&n,&st,&ed);
        For(i,1,n)scanf("%lld",&a[i]);
        f[st][0]=1;
        For(i,1,n) For(j,0,ed){
            if(f[j][i-1]){
                int p=j-a[i],q=j+a[i];
                if(p>=0)f[p][i]=1;
                if(q<=ed)f[q][i]=1;
            }
        }
        Bor(i,0,ed)if(f[i][n]){cout<<i<<endl;return 0;}
        cout<<-1;
        return 0;
    }
  • 相关阅读:
    HDU1029 Ignatius and the Princess IV
    UVA11039 Building designing【排序】
    UVA11039 Building designing【排序】
    POJ3278 HDU2717 Catch That Cow
    POJ3278 HDU2717 Catch That Cow
    POJ1338 Ugly Numbers(解法二)
    POJ1338 Ugly Numbers(解法二)
    UVA532 Dungeon Master
    UVA532 Dungeon Master
    POJ1915 Knight Moves
  • 原文地址:https://www.cnblogs.com/five20/p/9071611.html
Copyright © 2011-2022 走看看