这道题 一开始想的是贪心 但是想歪了 每次打对伤害总体贡献最大的一个 因为小数据 所以随便怎么搞 然后 WA了几发 又想到小数据枚举还能有什么 于是dfs搜索… …
这道我想的是枚举搜索路径 因为能对当前Loc位置产生伤害只能有三个位置Loc-1,Loc,Loc+1 所以在打后面的敌人之前 可以把他前面的两个位置及之前敌人打掉
综上所述 如果要打掉当前位置的敌人 要么是打他前面位置的敌人 顺手打掉的
要么是就打他这个位置 要么在打他后面那个位置的敌人 一定要打掉的
所以 代码如下
#include<iostream>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f;
int life[20];
int n,a,b;
int ans;
void dfs(int time,int loc){
if(loc==n)
{
ans = min(ans,time);
return;
}
if(life[loc-1]<0) dfs(time,loc+1);
int t=0;
if(life[loc-1]>=0)
{
t+=life[loc-1]/b+1;
life[loc]-=t*a;
life[loc+1]-=t*b;
dfs(time+t,loc+1);
life[loc]+=t*a;
life[loc+1]+=t*b;
}
int times = life[loc]/a+1;
if(life[loc]>=0 && t<=times){
for(int i=t+1;i<=times;i++){
life[loc]-=i*a;
life[loc+1]-=i*b;
dfs(time+i,loc+1);
life[loc]+=i*a;
life[loc+1]+=i*b;
}
}
return;
}
int main(){
cin >> n >> a >> b;
for(int i=0;i<n;i++) cin >> life[i];
ans = 500;
int start=0;
while(life[0]>=0){
life[0]-=b;
life[1]-=a;
life[2]-=b;
start++;
}
while(life[n-1]>=0){
life[n-1]-=b;
life[n-2]-=a;
life[n-3]-=b;
start++;
}
dfs(start,1);
cout << ans << endl;
}