BZOJ2748: [HAOI2012]音量調節
阿新 • • 發佈:2018-11-09
Description
一個吉他手準備參加一場演出。他不喜歡在演出時始終使用同一個音量,所以他決定每一首歌之前他都要改變一次音量。
在演出開始之前,他已經做好了一個列表,裡面寫著在每首歌開始之前他想要改變的音量是多少。
每一次改變音量,他可以選擇調高也可以調低。
音量用一個整數描述。輸入檔案中給定整數beginLevel,代表吉他剛開始的音量,以及整數maxLevel,代表吉他的最大音量。
音量不能小於0也不能大於maxLevel。
輸入檔案中還給定了n個整數c1,c2,c3…..cn,表示在第i首歌開始之前吉他手想要改變的音量是多少。
吉他手想以最大的音量演奏最後一首歌,你的任務是找到這個最大音量是多少。
Input
第一行依次為三個整數:n, beginLevel, maxlevel。
第二行依次為n個整數:c1,c2,c3…..cn。
Output
輸出演奏最後一首歌的最大音量。
如果吉他手無法避免音量低於0或者高於maxLevel,輸出-1。
Sample Input
3 5 105 3 7
Sample Output
10HINT
1<=N<=50,1<=Ci<=Maxlevel 1<=maxlevel<=10000<=beginlevel<=maxlevel
題解Here!
#include<iostream> #include<algorithm> #include<cstdio> #define MAXN 60 #define MAXM 1010 using namespace std; int n,m,s; int val[MAXN]; bool dp[MAXN][MAXM]; inline int read(){ int date=0,w=1;char c=0; while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();} while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();} return date*w; } void work(){ dp[0][s]=true; for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)if(dp[i-1][j]){ if(j+val[i]<=m)dp[i][j+val[i]]=true; if(j-val[i]>=0)dp[i][j-val[i]]=true; } for(int i=m;i>=0;i--)if(dp[n][i]){printf("%d\n",i);return;} printf("-1\n"); } void init(){ n=read();s=read();m=read(); for(int i=1;i<=n;i++)val[i]=read(); } int main(){ init(); work(); return 0; }