HDU The Magic Tower(2015.12.26训练 杭电校赛)

题目链接:Click here

题意:战士要到一座MAGIC TOWER上打败一个BOSS解救公主,战士跟BOSS有各自的血量值,攻击值和防御值,两个人轮流攻击对方,当某一方血量小于或等于零的时候结束,问战士是否能打败BOSS

思路:开始的时候单纯的用循环来,结果超时了。。。。

具体看代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

int main()
{
    char name;
    int wh, wa, we, bh, ba, be, flag, a1, a2;
    int w_a, b_a, tag;
    while(scanf("%c", &name) != EOF)
    {
        scanf("%d%d%d", &wh, &wa, &we);
        scanf("%d%d%d", &bh, &ba, &be);
        a1 = a2 = 0;
        w_a = wa - be;
        b_a = ba - we;
        if(w_a < 0)
            w_a = 0;
        if(b_a < 0)
            b_a = 0;
        if(w_a == 0)
   //如果战士攻击力为零,那么必定输
            flag = 0;
        else if(b_a == 0)
            flag = 1;
        else
        {
            a1 = bh / w_a;
            a2 = wh / b_a;
   //计算两人打对方知道HP为零或者还有一次的血量时需要的次数
            if(a1 < a2)
 
            {
                bh = bh - (a1 * w_a);
                wh = wh - (a1 * b_a);
            }
            else
            {
                bh = bh - a2 * w_a;
                wh = wh - a2 * b_a;
            }
            if(bh == 0 && wh == 0)
   //如果同时血量为零,那么判断谁先攻击,先攻击的获胜
            {
                if(name == 'W')
                    flag = 1;
                else
                    flag = 0;
            }
            else
            {
                if(name == 'W')
                    tag = 1;
                else
                    tag = 0;
                while(wh > 0 && bh > 0)
                {
                    if(tag == 1)
                    {
                        bh -= w_a;
                        tag = 0;
                    }
                    else
                    {
                        wh -= b_a;
                        tag = 1;
                    }
                }
                if(wh <= 0)
                    flag = 0;
                else
                    flag = 1;
            }
        }
        if(flag == 0)
            printf("Warrior loses\n");
        else
            printf("Warrior wins\n");
        getchar();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值