codeforces 6d 搜索

题意:有一排敌人,各地有自己的hp,你要向他们发动攻击把他们消灭(即所有敌人的hp都小于0),攻击i时,i的hp减少a,和i相邻的敌人hp减少b,问最少攻击多少次才能达成目标.注:hp已经小于0的敌人你仍然可以攻击

题解:对于一个敌人,攻击上限显然等于消灭他以及左右两边敌人所需的最大次数,同时在做出攻击决定时,一定要保证左侧的敌人死亡,因为后续的攻击无法伤害到他

#include <bits/stdc++.h>
using namespace std;

const int maxn = 20;
int h[maxn];
int n, a, b;
int ansn = 10000000;
vector <int> tmp;
vector <int> ans;
void dfs(int i, int sum){
    if(sum >= ansn) 
		return ;
    if(i == n){//不能打第n个
        if(h[i] < 0 && sum < ansn){
            ansn = sum;
            ans = tmp;
        }
        return ;
    }
    for(int j = 0; j <= max(h[i - 1] / b + 1, max(h[i] / a + 1, h[i + 1] / b + 1)); j ++){
        if(h[i - 1] < b * j){//最左边的必须打死,不然他在后面就不能被打死
            h[i - 1] -= b * j;
            h[i + 1] -= b * j;
            h[i] -= a * j;
            for(int k = 1; k <= j; k ++)
                tmp. push_back(i);
            dfs(i + 1, sum + j);
            h[i - 1] += b * j;
            h[i + 1] += b * j;
            h[i] += a * j;
            for(int k = 1; k <= j; k ++)
                tmp. pop_back();
        }
    }
}
int main(){
    scanf("%d %d %d", &n, &a, &b);
    for(int i = 1; i <= n; i ++)
        scanf("%d", &h[i]);
    dfs(2, 0);
    printf("%d\n", ansn);
    for(int i = 0; i < ans. size(); i ++)
        printf("%d ", ans[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86520114
今日推荐