51nod--蜥蜴和地下室
2018-04-02 20:28
232 查看
emmm,51nod上的题真的很有趣,虽然很难~~~这道题有几个难点吧:其一是要先将首尾两个弓箭手打死,因为打不到首尾两个弓箭手;其二就是要打当前的弓箭手时,前一个弓箭手一定要死,当前弓箭手可以不死因为可以通过后一个弓箭手来溅射伤害;其他就没什么难度了,上代码吧#include<iostream>
using namespace std;
int n,a,b;
int map[12];
int step=0;
int m=100000;
void dfs(int x,int ans)
{
if(x==n-1) //n-1的畜生早就死掉了
{
m=m<ans?m:ans;
return ;
}
if(map[x-1]<0)//如果x-1畜生已经死掉了
{
dfs(x+1,ans);
}
int t;
t=map[x-1]/b+1;
if(map[x-1]>=0)
{
map[x-1]-=b*t;//没有死的话 就打死 这个x-1畜生
map[x]-=a*t;
map[x+1]-=b*t;
dfs(x+1,ans+t);
map[x-1]+=b*t; //或者不打死这个x-1畜生
map[x+1]+=b*t;
map[x]+=a*t;
}
int t2=map[x]/a+1; //准备打当前x这个畜生
int i;
if(t<0)
{
t=0;
}
if(map[x]>=0&&t2>t)
{
for(i=t;i<=t2;i++)
{
map[x-1]-=b*i;
map[x]-=a*i;
map[x+1]-=b*i;
dfs(x+1,ans+i);
map[x-1]+=b*i;
map[x]+=a*i;
map[x+1]+=b*i;
}
}
return ;
}
int main()
{
cin>>n>>a>>b;
for(int i=0;i<n;i++)
{
cin>>map[i];
}
while(map[0]>=0) //先打死首尾两个畜生
{
map[1]-=a;
map[0]-=b;
map[2]-=b;
step++;
}
while(map[n-1]>=0)
{
map[n-2]-=a;
map[n-3]-=b; //因为n是大于等于3的 因此不用担心越界
map[n-1]-=b;
step++;
}
dfs(1,step);
cout << m<<endl;
return 0;
}
相关文章推荐
- 51nod 1489蜥蜴和地下室
- 1489 蜥蜴和地下室 51NOD
- 51nod 1489 蜥蜴和地下室(DFS)
- 51nod 1489 蜥蜴和地下室(dfs)
- 51nod 1489 蜥蜴和地下室
- 蜥蜴和地下室 51Nod - 1489
- 51Nod 1489 蜥蜴和地下室
- 51Nod-1489-蜥蜴和地下室
- 51Nod 1489 蜥蜴和地下室 DFS
- 51nod 1489 蜥蜴和地下室 dfs
- 51nod 1489 蜥蜴和地下室(dfs or dp)
- JAVA学习45_51Nod-1489-蜥蜴和地下室
- 51nod 1489 蜥蜴和地下室 暴力dfs
- 51Nod 1489 蜥蜴和地下室
- 51nod 1489 蜥蜴和地下室 dfs
- 51nod 1489 蜥蜴和地下室
- 51Nod-1489-蜥蜴和地下室
- 51Nod-1489 蜥蜴和地下室(暴力DFS)
- 【51Nod】1489 - 蜥蜴和地下室(dfs)
- 蜥蜴与地下室