【GZOJ】1374——口袋妖怪对战

10 篇文章 0 订阅
8 篇文章 0 订阅

题目链接广大OJ1374
本题亦为广大15级第一次周赛的I题。

题目内容

Problem Description
一年一度的口袋妖怪大赛开始了!!!

现在是四天王之一的渡对战传说中的训练师帽子!!!

渡的快龙使用了大字爆!

帽子的帕路奇犽正面接下了这一击!!!

帽子的帕路奇犽竟然毫发无损!!!

接下来的战斗会怎样呢!!!胜利的天平会往哪一位倾斜呢!!!

。。。。。。

与其等待结果,不如让我们来预测一下比赛结果吧。

现在我们可以知道双方的数据,包括名字 血量 攻击力 防御力 速度 技能威力 属性相克(例如说 属性相克为x2 就表示攻击方攻击防御方的伤害有2倍修正)

属性相克只有6种:x1,x2,x4,x0,x1/2,x1/4

接着是伤害的计算公式。口袋妖怪的伤害计算公式比较复杂,这里对其进行简化:

伤害=(攻击方攻击力×42×技能威力÷防御方防御力÷50+2)×属性相克

所有变量应按int类型的方式来计算,属性相克的x1/2和x1/4按除以2和除以4来计算。也就是说伤害的计算结果一定为整数。

在这里如果伤害计算结果是0的话要修正为1,就算是属性相克为x0也一样。

对战是回合制的类型,速度快的(速度的值比较大的)先手。

当速度一样时默认第一只口袋妖怪先攻击。

由于存在先后攻击顺序,所以不可能有平局的情况出现。

假设每次攻击都会命中,现在,给你这些数据,告诉我谁会胜利。

Input
输入的第一行包括一个整数n(1<=n<=10000),表示有n场对战需要计算。

接下有n组数据,每组数据占两行

每组数据的第一行为第一只口袋妖怪的数据,第二行为第二只口袋妖怪的数据。

每只口袋妖怪的数据包括名字(一个长度不超过20的字符串),血量h(1<=h<=10000),攻击力a(1<=a<=2000),防御力d(1<=d<=2000),速度s(1<=s<=2000),技能威力p(1<=p<=255),以及属性相克(只有六种,分别为:x1,x2,x4,x0,x1/2,x1/4)。分别用空格隔开。

Output
对于每组输入数据,输出谁会胜利。格式参照样例。
Sample Input
2
Palkia 384 372 220 184 100 x2
Dragonite 292 328 175 284 110 x1/4
Pi 100 100 200 300 1 x1/2
pi 100 200 100 200 1 x1/2
Sample Output
Round #1 : Palkia win!
Round #2 : Pi win!
Hint
善用scanf和printf

解题思路

其实这就是一道比较繁琐的入门题,只要耐下心来做就能够完成的。
首先,利用这些数据和公式算出双方每回合会受到的伤害
注意计算的时候不要用double要用int,而且当结果为0时记得修正为1。
其次,再算出双方分别能坚持的回合数
然后通过回合数计算即可。
具体的参照代码。

代码

#include<cstdio>
#include<string>
using namespace std;
struct pokemon//该结构体用于存放口袋妖怪的数据
{
    string name;
    int hp,atk,def,spd,pow;
    int k;//用于表示属性相克的种类
};
int main()
{
    int n;
    scanf("%d",&n);
    for(int t=1;t<=n;t++)
    {
        pokemon a,b;
        string s;
        char c[20];
        scanf("%s",c);
        a.name=c;
        scanf("%d%d%d%d%d",&a.hp,&a.atk,&a.def,&a.spd,&a.pow);
        scanf("%s",c);
        s=c;
        if(s=="x1")a.k=1;
        else if(s=="x2")a.k=2;
        else if(s=="x4")a.k=4;
        else if(s=="x0")a.k=0;
        else if(s=="x1/2")a.k=8;
        else if(s=="x1/4")a.k=9;
        scanf("%s",c);
        b.name=c;
        scanf("%d%d%d%d%d",&b.hp,&b.atk,&b.def,&b.spd,&b.pow);
        scanf("%s",c);
        s=c;
        if(s=="x1")b.k=1;
        else if(s=="x2")b.k=2;
        else if(s=="x4")b.k=4;
        else if(s=="x0")b.k=0;
        else if(s=="x1/2")b.k=8;
        else if(s=="x1/4")b.k=9;
        int ha=42*b.atk*b.pow;//第一只口袋妖怪每回合会受到的伤害
        ha/=a.def;
        ha/=50;
        ha+=2;
        if(b.k==8)ha/=2;
        else if(b.k==9)ha/=4;
        else ha*=b.k;
        int hb=42*a.atk*a.pow;//第二只口袋妖怪每回合会受到的伤害
        hb/=b.def;
        hb/=50;
        hb+=2;
        if(a.k==8)hb/=2;
        else if(a.k==9)hb/=4;
        else hb*=a.k;
        if(ha==0)ha=1;
        if(hb==0)hb=1;
        int ra=a.hp/ha,rb=b.hp/hb;//这个是计算双方存活的回合数
        if(a.hp%ha!=0)ra++;
        if(b.hp%hb!=0)rb++;
        bool ans;//答案判断变量,若第一只赢为真,第二只赢为假
        if(ra>rb)ans=true;
        else if(ra<rb)ans=false;
        else if(a.spd>=b.spd)ans=true;
        else ans=false;
        printf("Round #%d : ",t);
        if(ans)printf("%s win!\n",a.name.c_str());
        else printf("%s win!\n",b.name.c_str());
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值