您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息