哈利喜欢玩角色扮演的电脑游戏《蜥蜴和地下室》。此时,他正在扮演一个魔术师。在最后一关,他必须和一排的弓箭手战斗。他唯一能消灭他们的办法是一个火球咒语。如果哈利用他的火球咒语攻击第i个弓箭手(他们从左到右标记),这个弓箭手会失去a点生命值。同时,这个咒语使与第i个弓箭手左右相邻的弓箭手(如果存在)分别失去b(1 ≤ b < a ≤ 10)点生命值。
因为两个端点的弓箭手(即标记为1和n的弓箭手)与你相隔较远,所以火球不能直接攻击他们。但是哈利能用他的火球攻击其他任何弓箭手。
每个弓箭手的生命值都已知。当一个弓箭手的生命值小于0时,这个弓箭手会死亡。请求出哈利杀死所有的敌人所需使用的最少的火球数。
如果弓箭手已经死亡,哈利仍旧可以将他的火球扔向这个弓箭手。
Input
第一行包含3个整数 n, a, b (3 ≤ n ≤ 10; 1 ≤ b < a ≤ 10),第二行包含n个整数——h1,h2,...,hn (1 ≤ hi ≤ 15), hi 是第i个弓箭手所拥有的生命力。
Output
以一行输出t——所需要的最少的火球数。
Input示例
3 2 1 2 2 2
Output示例
3
= =首先广搜超时了十几遍- - 然后一点点的优化
然后我也不知道为啥AC了 群里一个人让我贪心- - 我就胡乱贪了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <algorithm>
#include <cmath>
using namespace std;
int n,a,b;
int d[20];
int minsum;
void bfs(int t,int x)
{
if(t>=minsum) return ;
int z=1;
// for(int i=1;i<=n;i++) cout<<d[i]<<' '; cout<<" "<<x<<' '<<t<<endl;
for(int i=3;i<n-1;i++)
{
if(d[i-1]<0&&d[i]<0) continue;
else
{
int t1=d[i],t2=d[i-1],t3=d[i+1];
int j=1;
d[i]-=a;
d[i-1]-=b;
d[i+1]-=b;
while(d[i-1]>=0)
{
j++;
d[i]-=a;
d[i-1]-=b;
d[i+1]-=b;
}
bfs(t+j,i);
d[i]=t1;
d[i-1]=t2;
d[i+1]=t3;
z=0;
}
}
if(z)
{
if(t<minsum) minsum=t;
//cout<<minsum<<endl;
}
}
int main()
{
while(cin>>n>>a>>b)
{
memset(d,100,sizeof(d));
for(int i=1;i<=n;i++) cin>>d[i];
int j=0;
while(d[1]>=0)
{
j++;
d[2]-=a;
d[1]-=b;
d[3]-=b;
}
while(d[n]>=0)
{
j++;
d[n-1]-=a;
d[n-2]-=b;
d[n]-=b;
}
minsum=10000;
bfs(j,2);
cout<<minsum<<endl;
}
}