最终之战

最终之战

Problem Description

恭喜大家来到最终之战。这对珂朵莉一行来说是非常重要的一战,同时也极有可能是决定你能否在本次期末考试中成功AK,收获满分的一战,祝大家战斗胜利。

为了简化战斗过程,尽可能的用最小的损失来赢得战斗,我们制定了如下的战斗规则:
战斗开始后,我方会按照输入的顺序依次派出血量大于 0 的妖精循环攻击兽( 最后一人攻击完后再从第一个人开始依次攻击),每次攻击时所实际输出的攻击力为妖精的攻击力与所持圣剑之和,由于兽具有防御,兽实际收到的伤害为所受攻击的攻击力减去自身的防御力。攻击时优先攻击体型较大的兽。攻击结束后我方妖精同样会受到所攻击兽的攻击,受到的伤害同样为兽的攻击力减掉我方妖精的防御力。同时由于速度的不同,若我的速度大于所攻击兽的速度,我可以额外攻击一次相同的兽,若我的速度小于所攻击兽的速度 ,则兽可以多攻击我一次。
注意,若被攻击后血量小于等于0,则认为他已经牺牲了,将不会再参与之后回合的战斗,但当前回合不受影响,例如在某一回合中,兽受到攻击后血量降低至0一下,但它依然可以在本回合中发起反击。

下面是兽的数据:
中文名 英文名(id) 血 功 防 速 体型
叹月的最初之兽 Chantre 2333 100 7 input 9
深潜的第六兽 Timere 600 34 4 input 8
穿凿的第二兽 Aurora 200 24 3 input 7
绞吞的第四兽 tarde 400 43 9 input 6
广覆的第五兽 Materno 500 34 3 input 5
沉滞的第十一兽 Croyance 1100 65 6 input 4
织光的第十四兽 Vinkra 1400 90 2 input 3

下面是圣剑的数据:
中文名 英文名(id) 加成
珀西瓦尔 Perseval 78
瑟尼欧里斯 Ceniolis 43
瓦尔卡利斯 Valgaris 110
印萨尼亚 Insania 23
现在请你根据输入的数据判断能否在100回合内获胜,若可以获胜,输出攻击的最少回合数,否则输出“BOOM!”。
Input

首先输入四行,每行由五部分组成,分别是要派出的妖精的名字,血量,攻击值,防御值,速度和所拿的武器名。
最后一行包含七个空格分隔的数字,代表按体型由大到小的兽的速度。
妖精和武器的名字是一个长度不超过10的不含空格的字符串,1<=血量<=2000,10<=攻击值<=100,1<=防御值<=100,1<=速度<=10。
Output

若可以获胜(所有兽的血量均小于等于0),输出攻击的最少回合数,否则输出“BOOM!”。
Sample Input

Willem 2000 100 100 10 Valgaris
Chtholly 1500 70 40 9 Perseval
Nephren 1000 56 45 6 Insania
Ithea 500 65 54 5 Ceniolis
9 4 3 5 3 2 6
Sample Output

33
Hint

我方每派出一名妖精战斗即视为回合数加一。
实际所受攻击可能小于零,例如,当所受攻击力为5,自身防御力为10的时候,实际所受攻击为5-10=-5,这时无需特殊判断,可以理解为当攻击过小时,被攻击一方可化攻击为血量,血量上升。
Source

行走的二叉树

(队列比较好做)

#include<bits/stdc++.h>
using namespace std;
#define maxn 12
int ans;
map<string,int>jian;
struct node
{
    string str;
    double xue,gong,fang,su;
    int big;
    bool operator<(const node &c)const
    {
        return big<c.big;
    }
} b[maxn],cp;
struct edg
{
    string ss,dao;
    double xue,gong,fang,su;
} data[maxn],tp;
int main()
{
    jian["Perseval"]=78;
    jian["Ceniolis"]=43;
    jian["Valgaris"]=110;
    jian["Insania"]=23;
    bool flag;
    queue<edg>que;
    priority_queue<node>q;
    for(int i=0; i<4; i++)
    {
        cin>>data[i].ss>>data[i].xue>>data[i].gong>>data[i].fang>>data[i].su>>data[i].dao;
        que.push(data[i]);
    }
    for(int i=6; i>=0; i--)
    {
        cin>>b[i].su;
        b[i].big=i;
    }
    b[6].xue=2333,b[6].gong=100,b[6].fang=7;
    b[5].xue=600,b[5].gong=34,b[5].fang=4;
    b[4].xue=200,b[4].gong=24,b[4].fang=3;
    b[3].xue=400,b[3].gong=43,b[3].fang=9;
    b[2].xue=500,b[2].gong=34,b[2].fang=3;
    b[1].xue=1100,b[1].gong=65,b[1].fang=6;
    b[0].xue=1400,b[0].gong=90,b[0].fang=2;
    for(int i=6; i>=0; i--)
        q.push(b[i]);
    while(1)
    {
        tp=que.front();
        que.pop();
        cp=q.top();
        q.pop();
        if(tp.su<cp.su)
        {
            cp.xue-=(tp.gong+jian[tp.dao]-cp.fang);
            tp.xue-=(cp.gong*2-2*tp.fang);
        }
        else if(tp.su>cp.su)
        {
            cp.xue-=(tp.gong+jian[tp.dao]-cp.fang)*2;
            tp.xue-=(cp.gong-tp.fang);
        }
        else
        {
            cp.xue-=(tp.gong+jian[tp.dao]-cp.fang);
            tp.xue-=(cp.gong-tp.fang);
        }
        if(cp.xue>0)q.push(cp);
        if(tp.xue>0)que.push(tp);
        ans++;
        if(q.size()==0)
        {
            flag=1;
            break;
        }
        if(que.empty())
        {
            flag=0;
            break;
        }
    }
    if(flag)
        printf("%d\n",ans);
    else printf("BOOM!\n");
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值