1. 程式人生 > >51nod蜥蜴與地下室(1498)(暴力搜索)

51nod蜥蜴與地下室(1498)(暴力搜索)

end math += name out 狀態 是我 ffffff fff

題意:一個數組s,再給你a,b值,除了s1和sn外,你可以攻擊其他元素,你對這個元素的傷害為a,那麽他兩邊的元素會受到b的牽連傷害,si-a,si-1-b,si+1-b;

求最小的次數,使得這個數組的值全部小於0;

解題思路:首先1和n不能直接攻擊,所以我們得先把1和n的先處理下,然後我們會發現剩下的元素都有兩種狀態,一種是我們直接打死他,另一種是我們通過牽連傷害打死他,因為數據小,所以直接暴力搜索就行了

代碼:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<set>
#include<map>
#include<queue>
#include<vector>
#define ll long long int
#define mod 1000000007
#define me(a,b) memset(a,b,sizeof(a))
const int inf=0x7fffffff;
using namespace std;
int h[20];
int ans=inf;
int n,a,b;
void dfs(int pos,int sum)
{
if(pos==n)
{
ans=min(ans,sum);
return;
}
if(h[pos-1]<0)
dfs(pos+1,sum);
int v=0;
if(h[pos-1]>=0)
{
v=h[pos-1]/b+1;
h[pos-1]-=v*b;
h[pos]-=v*a;
h[pos+1]-=v*b;
dfs(pos+1,sum+v);
h[pos-1]+=v*b;
h[pos]+=v*a;
h[pos+1]+=v*b;
}
int vv=h[pos]/a+1;
if(h[pos]>=0&&vv>v)
{
for(int i=v+1;i<=vv;i++)
{
h[pos-1]-=i*b;
h[pos]-=i*a;
h[pos+1]-=i*b;
dfs(pos+1,sum+i);
h[pos-1]+=i*b;
h[pos]+=a*i;
h[pos+1]+=b*i;
}
}
return;
}
int main()
{
int h1,hn;
while(cin>>n>>a>>b)
{
h1=0;
hn=0;
for(int i=1;i<=n;i++)
cin>>h[i];
h1=h[1]/b+1;
h[1]=h[1]-h1*b;
h[2]=h[2]-h1*a;
h[3]=h[3]-h1*b;
if(h[n]>=0)
{
hn=h[n]/b+1;
h[n]=h[n]-hn*b;
h[n-1]=h[n-1]-hn*a;
h[n-2]=h[n-2]-hn*b;
}
dfs(2,0);
cout<<ans+h1+hn<<endl;
}
return 0;
}

51nod蜥蜴與地下室(1498)(暴力搜索)