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


简单dp
// 去吧!皮卡丘! 把AC带回来!
//      へ     /|
//   /\7    ∠_/
//   / │   / /
//  │ Z _,< /   /`ヽ
//  │     ヽ   /  〉
//  Y     `  /  /
//  イ● 、 ●  ⊂⊃〈  /
//  ()  へ    | \〈
//   >ー 、_  ィ  │ //
//   / へ   / ノ<| \\
//   ヽ_ノ  (_/  │//
//    7       |/
//    >―r ̄ ̄`ー―_
//**************************************
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); }
template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); }
template <class T> inline T min(T a, T b, T c, T d) {
  return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d) {
  return max(max(a, b), max(c, d));
}
#define pi acos(-1)
#define mem(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********\n");
#define mp make_pair
#define pb push_back
// name*******************************
int n;
int s, maxn;
bool dp[55][1005];
int a[55];
// function******************************
//***************************************
int main() {
  // ios::sync_with_stdio(0); cin.tie(0);
  // freopen("test.txt", "r", stdin);
  //  freopen("outout.txt","w",stdout);
  cin >> n>>s>>maxn;
  For(i, 1, n) {
    int x;
    cin >> x;
    a[i] = abs(x);
  }
  For(i, 0, n) For(j, 0, n) dp[i][j] = 0;
  dp[0][s]=1;
  For(i, 1, n) {
    For(j, 0, maxn) {
      if (j + a[i] <= maxn)
        dp[i][j] |= dp[i - 1][j + a[i]];
      if (j - a[i] >= 0)
        dp[i][j] |= dp[i - 1][j - a[i]];
        // cout<<i<<" "<<j<<":"<<dp[i][j]<<endl;
    }
  }
  FFor(i, maxn, 0) {
    if (dp[n][i]) {
      cout << i;
      return 0;
    }
  }
cout<<-1;
  return 0;
}

 

posted @ 2018-03-19 15:56  planche  阅读(172)  评论(0编辑  收藏  举报