Mach_Cap的博客

El Psy Congroo.这一切都是斯坦因之门的选择。

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

题目链接广大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());
    }
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mach_Cap/article/details/49912299
个人分类: 周赛题解 水题 GZOJ
想对作者说点什么? 我来说一句

Pokemon Online队伍包

2013年07月27日 23KB 下载

口袋妖怪》超级素材包

2014年02月19日 39.82MB 下载

GBC遊戲口袋妖怪水晶中文版

2010年04月03日 2MB 下载

【转】口袋妖怪的一些小图标

2014年01月30日 49KB 下载

unity3D仿口袋妖怪游戏源码

2018年01月26日 215.35MB 下载

wii 口袋妖怪战斗 革命

2010年05月13日 22KB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭