原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1489
思路:看数据,标准的dfs,先打掉最左边和最右边的怪,然后对中间的深搜,细节看代码
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10 + 5;
int n, k, a, b, p, m, h[MAXN], min_step = 21312313;
void dfs(int pos, int step) {
if (pos == n - 1) {
min_step = min(min_step, step);
}
else {
if (h[pos - 1] < 0)dfs(pos + 1, step);
int cnt = 0;
if (h[pos - 1] >= 0) {
cnt = h[pos - 1] / b + 1;
h[pos - 1] -= cnt*b;
h[pos] -= cnt*a;
h[pos + 1] -= cnt*b;
dfs(pos + 1, step + cnt);
h[pos - 1] += cnt*b;
h[pos] += cnt*a;
h[pos + 1] += cnt*b;
}
int times = h[pos] / a + 1;
if (h[pos] >= 0 && cnt < times) {
for (int i = cnt + 1; i <= times; i++) {
h[pos - 1] -= i*b;
h[pos] -= i*a;
h[pos + 1] -= i*b;
dfs(pos + 1, step + i);
h[pos - 1] += i*b;
h[pos] += i*a;
h[pos + 1] += i*b;
}
}
}
}
int main() {
scanf("%d %d %d", &n, &a, &b);
for (int i = 0; i < n; i++) {
scanf("%d", &h[i]);
}
int step = 0, t1 = h[0];
step += t1 / b + 1;
h[0] -= (t1 / b + 1) * b;
h[1] -= (t1 / b + 1) * a;
h[2] -= (t1 / b + 1) * b;
int t2 = h[n - 1];
if (t2 >= 0) {
step += t2 / b + 1;
h[n - 1] -= (t2 / b + 1)*b;
h[n - 2] -= (t2 / b + 1)*a;
h[n - 3] -= (t2 / b + 1)*b;
}
dfs(1, step);
printf("%d\n", min_step);
return 0;
}