51Nod - 1489 蜥蜴和地下室 (dfs)

題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1489點擊打開鏈接

題目來源: 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的層數爲8的時間複雜度

另外因爲血量小於16而a至少爲2

因此每層遍歷循環8即可(9會超時)

#include <bits/stdc++.h>
using namespace std;
int n,a,b;
int blood[20];
int fire[20];
int ans;
void dfs(int num,int sum)
{
    if(num==n)
    {
        if(blood[num-1]<0&&blood[num]<0)
        {
            ans=min(ans,sum);
        }
        return;
    }
    for(int i=0;i<=8;i++)
    {
        blood[num-1]-=i*b;
        blood[num]-=i*a;
        blood[num+1]-=i*b;
        if(blood[num-1]<0)
            dfs(num+1,sum+i);
        blood[num-1]+=i*b;
        blood[num]+=i*a;
        blood[num+1]+=i*b;
    }
}
int main()
{
    cin >> n >> a >> b;
    for(int i=1;i<=n;i++)
        cin >> blood[i];
    ans=111111;
    int mid1=blood[1]/b+1;
    blood[1]-=mid1*b;
    blood[2]-=mid1*a;
    blood[3]-=mid1*b;
    int mid2=0;
    if(blood[n]>=0)
    {
        mid2=blood[n]/b+1;
        blood[n-2]-=mid2*b;
        blood[n-1]-=mid2*a;
        blood[n]-=mid2*b;
    }
    dfs(2,0);
    if(ans==111111)
        ans=0;
    cout << ans+mid1+mid2 << endl;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章