[CSP-J模拟赛] 变音量

题目描述

你将要在元旦演奏一场吉他专场。但你不希望声音平淡,所以你希望每个曲之间都有变化。现在你已经确定了每个曲可以与上一个曲之间的音量的变化量,即每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数,也不能太高,因此必需保证每首曲音量在0和maxLevel之间(包含)。 你的任务是,根据已有的开始音量beginLevel 和每首曲之间的变化量,求出最后一首曲的最大可能音量。如果没有方案,输出 -1。

输入格式

文件第一行有三个整数,n, beginLevel, maxLevel,分别表示曲目数,开始量,最大限制音量。 下面有n-1行整数,第i行整数表示第i首曲与第i+1首曲之间的变化量。

输出格式

文件只一行一个数,答案。

输入样例

4  5 10
5
3
7

输出样例

10

数据范围与提示

1<=n<=60; 1<= maxLevel <=1000 0<= beginLevel <= maxLevel

#include<bits/stdc++.h>
using namespace std;
int n,s,l;
int a[70];
bool f[120][2001];
int main()
{
	cin >> n >> s >> l;
	for(int i = 2;i <= n; i++) scanf("%d",&a[i]);
	memset(f,0,sizeof(f));
	f[1][s] = 1;
	for(int i = 2; i <= n; i++)
	{
		for(int j = 0; j <= l; j++)
		{
			f[i][j] = (j - a[i] >= 0 && f[i-1][j - a[i]]) || (j+a[i] <= l && f[i-1][j+a[i]]);
		}
	}
	int ans = -1;
	for(int i = l; i >= 0; i--)
	{
		if(f[n][i] == 1)
		{
			ans = i;
			break;
		}
	}
	cout << ans << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值