51Nod 1489 蜥蜴和地下室

这里写图片描述

这道题 一开始想的是贪心 但是想歪了 每次打对伤害总体贡献最大的一个 因为小数据 所以随便怎么搞 然后 WA了几发 又想到小数据枚举还能有什么 于是dfs搜索… …

这道我想的是枚举搜索路径 因为能对当前Loc位置产生伤害只能有三个位置Loc-1,Loc,Loc+1 所以在打后面的敌人之前 可以把他前面的两个位置及之前敌人打掉

综上所述 如果要打掉当前位置的敌人 要么是打他前面位置的敌人 顺手打掉的
要么是就打他这个位置 要么在打他后面那个位置的敌人 一定要打掉的

所以 代码如下

#include<iostream>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f;
int life[20];
int n,a,b;
int ans;
void dfs(int time,int loc){
    if(loc==n) 
    {
        ans = min(ans,time);
        return;
    }
    if(life[loc-1]<0) dfs(time,loc+1);
    int t=0;
    if(life[loc-1]>=0)
    {
        t+=life[loc-1]/b+1;
        life[loc]-=t*a;
        life[loc+1]-=t*b;
        dfs(time+t,loc+1);
        life[loc]+=t*a;
        life[loc+1]+=t*b;
    }
    int times = life[loc]/a+1;
    if(life[loc]>=0 && t<=times){
        for(int i=t+1;i<=times;i++){
            life[loc]-=i*a;
            life[loc+1]-=i*b;
            dfs(time+i,loc+1);
            life[loc]+=i*a;
            life[loc+1]+=i*b;
        }
    }
    return;
}
int main(){
    cin >> n >> a >> b;
    for(int i=0;i<n;i++) cin >> life[i];
    ans = 500;
    int start=0;
    while(life[0]>=0){
        life[0]-=b;
        life[1]-=a;
        life[2]-=b;
        start++;
    }
    while(life[n-1]>=0){
        life[n-1]-=b;
        life[n-2]-=a;
        life[n-3]-=b;
        start++;
    }
    dfs(start,1);
    cout << ans << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值