Codeforces Round #278 (Div. 2) C. Fight the Monster(暴力)

1 篇文章 0 订阅
C. Fight the Monster


A monster is attacking the Cyberland!

Master Yang, a braver, is going to beat the monster. Yang and the monster each have 3 attributes: hitpoints (HP), offensive power (ATK) and defensive power (DEF).

During the battle, every second the monster's HP decrease by max(0, ATKY - DEFM), while Yang's HP decreases by max(0, ATKM - DEFY), where index Y denotes Master Yang and index M denotes monster. Both decreases happen simultaneously Once monster's HP ≤ 0 and the same time Master Yang's HP > 0, Master Yang wins.

Master Yang can buy attributes from the magic shop of Cyberland: h bitcoins per HP, a bitcoins per ATK, and d bitcoins per DEF.

Now Master Yang wants to know the minimum number of bitcoins he can spend in order to win.

Input

The first line contains three integers HPY, ATKY, DEFY, separated by a space, denoting the initial HP, ATK and DEF of Master Yang.

The second line contains three integers HPM, ATKM, DEFM, separated by a space, denoting the HP, ATK and DEF of the monster.

The third line contains three integers h, a, d, separated by a space, denoting the price of HP, ATK and DEF.

All numbers in input are integer and lie between 1 and 100 inclusively.

Output

The only output line should contain an integer, denoting the minimum bitcoins Master Yang should spend in order to win.

Sample test(s)
Input
1 2 1
1 100 1
1 100 100
Output
99
Input
100 100 100
1 1 1
1 1 1
Output
0
Note

For the first sample, prices for ATK and DEF are extremely high. Master Yang can buy 99 HP, then he can beat the monster with 1 HP left.

For the second sample, Master Yang is strong enough to beat the monster, so he doesn't need to buy anything.


题意:玩一个游戏,问你保持血量大于零的情况下把怪物杀死,最少需要花多少钱(因为钱可以买属性,果然是屌丝玩家啊……),第一行给你三个数值hy,ay,dy,分别代表你的生命值,攻击力,防御力,第二行给你三个数值hm,am,dm,分别代表怪物的生命值,攻击力,防御力,第三行给你三个数值h,a,d,分别代表生命值,攻击力,防御力的单价。并且(给你的所有数值都在0——100之间,包括0,100)。计算方式,每次自己和怪物同时受到攻击,自己将减少(怪物攻击力-自己防御力)点血量,怪物将减少(自己攻击力-怪物防御力)点血量。


思路:用两个循环枚举购买的攻击力和防御力,以确定自己攻击力防御力,可求出最少需要血量。然后判断此时花费的钱是不是更少。

    for(int j=0;j<=max(0,100-ay+dm);j++)//攻击
    for(int k=0;k<=max(0,am-dy);k++)//防御

由此知:自己有效攻击力=j+ay-dm;怪物有效攻击力=am-dy-k;怪物血量=hm;

已知自己攻击和对方血量,可以求出最少攻击次数n,n=hm/(j+ay-dm);if(hm%(j+ay-hm)!=0) n++;//因为整数除法去尾,所以判断是否需要再打一下才能打死。

所以自己需要最少血量为:n*(am-dy-k)+1-hy;//当为负数时应看做零。

       范围确定方法一:因为怪物防御力最多100,血量最多100,自己攻击最低0,所以最多买200攻击必定可以秒杀对方(买再多无意义)。

                                    因为怪物攻击力最多是100,自己防御力最少是0,所以最多买100攻击就可以不受伤害(买再多无意义)。

       范围确定方法二:原理相同,自己攻击力-怪物防御力>100就会无意义;所以列出方程:ay+j-dm<=100,即j<=100-ay+dm;因为j>=0,所以j<=max(0,100-ay+dm);

                                    自己防御力-怪物攻击力>0就会无意义;所以列出方程:dy+k-am<=0,即k<=am-dy;因为k>=0,所以k<=max(0,am-dy);


#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 100000007

int main(){
    int hy,ay,dy,hm,am,dm,h,a,d;
    int mi=INF;
    cin>>hy>>ay>>dy>>hm>>am>>dm>>h>>a>>d;
    for(int j=0;j<=max(0,100-ay+dm);j++)//攻击
    for(int k=0;k<=max(0,am-dy);k++){//防御
        int n;
        if(j+ay-dm>0){
            n=hm/(j+ay-dm);
            if(hm%(j+ay-dm)!=0)
                n++;
            int i=max(0,n*(am-dy-k)+1-hy);
            mi=min(mi,i*h+j*a+k*d);
        }
    }
    cout<<mi<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值