这道题的思路真的很难想诶。

题解:

对于一个蜥蜴来说,他的血线是需要减去了n个a和m个b。那么我们可以列举出每个蜥蜴所有的n和m的可能,记录最终的结果,找到最小的结果即可。

因为蜥蜴最多才15个,所有这种暴力的方法是可行的,可以用bfs去实现。

先杀死两端的蜥蜴。递归的时候一定要注意,去算第i个蜥蜴时,一定要保证第i-1个蜥蜴是死亡的。这样才能保证当你递归到第i-1个的时候,前面的蜥蜴都是死的。

每个最终的结果可以用优先队列去维护。

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int n,a,b;
int h[20];
priority_queue<int,vector<int>,greater<int> >q;
void dfs(int i,int ans)
{
if(i==n-1)
{
q.push(ans);
return ;
}
int s1,s2;
if(h[i-1]<0)
s1=0;
else
s1=h[i-1]/b+1;
if(h[i]<0)
s2=0;
else
s2=h[i]/a+1;
int s=max(s1,s2);
for(int j=s1;j<=s;j++)
{
h[i-1]-=j*b;
h[i+1]-=j*b;
h[i]-=j*a;
dfs(i+1,ans+j);
h[i-1]+=j*b;
h[i+1]+=j*b;
h[i]+=j*a;
}
}
int main()
{
int i;
cin>>n>>a>>b;
for(i=0;i<n;i++)
cin>>h[i];
int ans=0;
if(n==3)
{
ans=(h[0]/b)>(h[2]/b)?(h[0]/b+1):(h[2]/b+1);
h[1]-=a*ans;
if(h[1]>=0)
ans=ans+h[1]/a+1;
cout<<ans<<endl;
}
else
{
int s1=h[0]/b+1,s2=h[n-1]/b+1;
ans=s1+s2;
h[1]-=s1*a;
h[n-2]-=s2*a;
h[0]=h[n-1]=-1;
h[2]-=s1*b;
h[n-3]-=s2*b;
dfs(2,ans);
cout<<q.top()<<endl;
}

return 0;
}

ps:要用c++11提交才能通过。