题解:P1877 [HAOI2012] 音量调节
分析
观察数据大小不难发现一个性质:
对于每一个阶段而言,可能的音量大小的个数不会超出 \(maxLeval = 5000\)。
而这启发我们用 set 维护计算到某一位得到的所有可能音量大小。
对于复杂度,我们每一次做的操作数最多为 set 大小,而操作数不超过 50,显然绰绰有余。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int c[N];
set<int> x, y;
int main() {
int n, maxn, b;
cin >> n >> b >> maxn;
for(int i = 1;i <= n;i ++ ) {
cin >> c[i];
}
x.insert(b);
for(int i = 1;i <= n;i ++ ) {
if(i % 2 == 1) {
for(int j : x) {
if(j - c[i] >= 0) y.insert(j - c[i]);
if(j + c[i] <= maxn) y.insert(j + c[i]);
}
x.clear();
}
else {
for(int j : y) {
if(j - c[i] >= 0) x.insert(j - c[i]);
if(j + c[i] <= maxn) x.insert(j + c[i]);
}
y.clear();
}
}
int ans = -1;
if(n % 2 == 1) {
for(int j : y) ans = max(ans, j);
}
else for(int j : x) ans = max(ans, j);
cout << ans;
return 0;
}

浙公网安备 33010602011771号