音量调节

音量调节

一个吉他手准备参加一场演出,他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之
前改变一次音量。在演出开始之前,他已经做好了一个列表,里面写着没受各开始之前他想要改变的
音量时多少,每一次改变音量,他可以选择调高也可以调低。
音量用一个整数描述,输入文件中给定整数beginlevel,代表及他刚开始的音量,整数
maxlevel 代表吉他的最大音量。音量不能小于0 也不能大于maxlevel。输入文件中还给定了n 个
整数c1,c2,c3,…,cn,表示在第i 首歌开始之前吉他手想要改变的音量是多少。
吉他手想要以最大的音量演奏最后一首歌,你的任务是找到这个最大音量是多少。
【输入】
第一行依次为三个整数:n,beginlevel,maxlevel。
第二行为n 个整数:c1,c2,c3,…,cn。
【输出】
输出演奏最后一首歌的最大音量,如果吉他手无法避免音量低于或者高于maxlevel,则输出-1。
【输入输出样例】
changingsounds.in changingsounds.out
3 5 10
5 3 7
10
4 8 20
15 2 9 10
-1

第一眼以为是随便统计一下然后发现贪心再然后发现最大值这一部分理解错了
初测40(当最大值为maxlevel时才输出)
01背包的模板套用

f[i][j]表示调节了j首歌音量时音量为i是否存在
f[i][j]!=0 -> f[i-a[j]][i+1]=1
f[i+a[j]][i+1]=1
代码如下:

#include
#include
using namespace std;
int n,begin,maxlevel;
int ans;
int a[51];
int f[51][1001];
int main()
{
    freopen("changingsounds.in","r",stdin);
    freopen("changingsounds.out","w",stdout);
    scanf("%d%d%d",&n,&begin,&maxlevel);
    f[0][begin]=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++)
        for(int j=maxlevel;j>=0;j--)
        {
            if(j-a[i]>=0)
                f[i][j]=f[i][j]||f[i-1][j-a[i]];
            if(j+a[i]<=maxlevel)
                f[i][j]=f[i][j]||f[i-1][j+a[i]];
        }
    for(int i=maxlevel;i>=1;i--)
        if(f[n][i]==1)
        {
            printf("%d",i);
            return 0;
        }
    printf("-1");
    return 0;
}

你可能感兴趣的:(模拟赛训练/简单dp)