1. 程式人生 > >51nod 1489 蜥蜴和地下室

51nod 1489 蜥蜴和地下室

print online lan har 時間 n) out 而且 空間限制

題目來源: 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 1
2 2 2
Output示例
3
思路:dfs之前先把1和n炸死 而且盡量不炸死 可以通過炸2或n-1把他們炸死 這樣可以保證使用次數最少 有種情況:假如打爆x-1後x還活著,則說明x的血量大於x-1 因此要打爆x,此時打爆x有兩種方法,就是直接打爆和通過打爆x+1來打爆x 搜索題 懷疑人生。。 屠龍寶刀點擊就送
#include <cstdio>
#define N 15
int n,a,b,h[N],ans=0x7fffffff;
void dfs(int pos,int sum)
{
    if(sum>ans) return
; if(pos==n) {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,v+sum); 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]-=b*i; h[pos]-=a*i; h[pos+1]-=b*i; dfs(pos+1,sum+i); h[pos-1]+=b*i; h[pos]+=a*i; h[pos+1]+=b*i; } } return ; } int Main() { scanf("%d%d%d",&n,&a,&b); for(int i=1;i<=n;++i) scanf("%d",&h[i]); int ans1,v=h[1]/b+1; ans1=v; h[1]-=v*b; h[2]-=v*a; h[3]-=v*b; if(h[n]>=0) { v=h[n]/b+1; h[n]-=v*b; h[n-1]-=v*a; h[n-2]-=v*b; ans1+=v; } dfs(2,0); if(ans==0x7fffffff) ans=0; printf("%d\n",ans1+ans); return 0; } int sb=Main(); int main(int argc,char *argv[]){;}

51nod 1489 蜥蜴和地下室