51nod oj 1489 蜥蜴和地下室【dfs】
原创
©著作权归作者所有:来自51CTO博客作者leibniz_zhang的原创作品,请联系作者获取转载授权,否则将追究法律责任
1489 蜥蜴和地下室
题目来源:
CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 10
难度:2级算法题
收藏
关注
哈利喜欢玩角色扮演的电脑游戏《蜥蜴和地下室》。此时,他正在扮演一个魔术师。在最后一关,他必须和一排的弓箭手战斗。他唯一能消灭他们的办法是一个火球咒语。如果哈利用他的火球咒语攻击第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 12 2 2
Output示例
3
dfs -.- 注意血量最后要小于0
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int shu[12];
int ans;int n,a,b;
void dfs(int xx,int lp,int shu[])
{
if (xx==n)
{
while (shu[xx-1]>=0)
{
lp++;
shu[xx-1]-=a;
}
ans=min(ans,lp);
return ;
}
while (shu[xx]>=0||shu[xx-1]>=0)
{
if (shu[xx-1]<0)
{
int p[10];
for (int i=0;i<n;i++)
p[i]=shu[i];
dfs(xx+1,lp,p);
}
lp++;
shu[xx]-=a;
shu[xx-1]-=b;
shu[xx+1]-=b;
}
int p[10];
for (int i=0;i<n;i++)
p[i]=shu[i];
dfs(xx+1,lp,p);
}
int kk(int bb,int xx)
{
int lp=0;
while (xx>=0)
{
lp++;
xx-=bb;
}
return lp;
}
int main()
{
int s=0,lp;
scanf("%d%d%d",&n,&a,&b);
for (int i=0;i<n;i++)
scanf("%d",&shu[i]);
lp=kk(b,shu[0]);
shu[0]-=b*lp;
shu[1]-=a*lp;
shu[2]-=b*lp;
s+=lp;
lp=kk(b,shu[n-1]);
shu[n-2]-=a*lp;
shu[n-1]-=b*lp;
shu[n-3]-=b*lp;
s+=lp;
ans=11111;
n--;
dfs(1,0,shu);
printf("%d\n",ans+s);
return 0;
}