1489 蜥蜴和地下室 bfs

2021-08-28 16:02:24 字數 1291 閱讀 6160

題目大意:輸入第一行包含3個整數 n, a, b

第二行輸入n只蜥蜴的生命值,你可以選擇編號為2~n的任意第i只蜥蜴進行火球術,對第i只蜥蜴造成a點傷害,對左右的蜥蜴造成b點傷害,當生命值<0時蜥蜴死亡(巨坑),但可以繼續攻擊,求殺死全部蜥蜴的最小攻擊次數。

n和hi的範圍都比較小,考慮dfs。

當是純dfs會爆,所以還要有策略的dfs。

因為這道題有點和poj那個熄滅燈泡有的像。必須找到乙個狀態,再dfs。因為題目中說第1,n不能直接打。所以1,n只能通過打2,n-1消滅。然後從左到右打,消滅第i只有兩種方式。

一:打第i只,需要打(hi+a-1)/a下。

二:打第i+1只,需要打(hi+b-1)/b下。

但是這裡只考慮打打第i+1只,因為打第i-1隻時,便是第一種打法。

開始考慮把第i只消滅,就消滅第i+1推導第n只。但是最後一只要特殊考慮。因為a>b;直接打本身更快,然後提交有幾個樣例wa了。

後來發現考慮有點問題,因為上面說因為打第i-1隻時,便是第一種打法。因為打第i-1隻時只打了(h(i-1)+b-1)/b)可能是小於(hi+a-1)/a的,這樣打(h(i-1)+b-1)/b)~(hi+a-1)/a下第i-1只都會死亡,所以dfs打的次數。ac

#includeusing namespace std;

int s[20];

int min_s=0x7fffffff;

int n, a, b;

void dfs(int i, int ans)

if(s[i]<=0)

int m1=0;

if(s[i]>0)//情況二

int m2=(s[i+1]+a-1)/a;

if(m2>m1) //(h(i-1)+b-1)/b小於(hi+a-1)/a

}}int main()

int m1=(s[1]+b-1)/b;//消滅第1只

s[1]=0;

s[2]-=a*m1;

s[3]-=b*m1;

int m2=(s[n]+b-1)/b;//消滅第n只

m2=max(0, m2);

s[n]=0;

if(n-1>=0)

s[n-1]-=a*m2;

if(n-2>=0)

s[n-2]-=b*m2;

dfs(2, m1+m2);

cout<

return 0;

}

dfs 1489 蜥蜴和地下室

1 秒131,072 kb 10 分 2 級題 哈利喜歡玩角色扮演的電腦遊戲 蜥蜴和地下室 此時,他正在扮演乙個魔術師。在最後一關,他必須和一排的弓箭手戰鬥。他唯一能消滅他們的辦法是乙個火球咒語。如果哈利用他的火球咒語攻擊第i個弓箭手 他們從左到右標記 這個弓箭手會失去a點生命值。同時,這個咒語使與...

51Nod 1489 蜥蜴和地下室

1489 蜥蜴和地下室 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 哈利喜歡玩角色扮演的電腦遊戲 蜥蜴和地下室 此時,他正在扮演乙個魔術師。在最後一關,他必須和一排的弓箭手戰鬥。他唯一能消滅他們的辦法是乙個火球咒語。如果哈利用他的火球咒語...

51Nod 1489 蜥蜴和地下室

這道題 一開始想的是貪心 但是想歪了 每次打對傷害總體貢獻最大的乙個 因為小資料 所以隨便怎麼搞 然後 wa了幾發 又想到小資料列舉還能有什麼 於是dfs搜尋 這道我想的是列舉搜尋路徑 因為能對當前loc位置產生傷害只能有三個位置loc 1,loc,loc 1 所以在打後面的敵人之前 可以把他前面的...