Problem 3844 --简单的血量统计程序

3844: 简单的血量统计程序

"
Time Limit $10$ 秒/Second(s) Memory Limit $512$ 兆字节/Megabyte(s)
提交总数 $0$ 正确数量 $0$
裁判形式 标准裁判/Standard Judge 我的状态 尚未尝试
难度 分类标签

题目要求你为一款战舰游戏制作血量统计程序。

一部分参数详解:

船只类型:CV CA CL BB DD

弹药类型:AP HE ST DT

HE弹药:完全穿透时造成100%最高伤害,穿深大于装甲厚度,小于130%装甲厚度时为50%伤害,其他情况不造成伤害。不会跳弹。

AP弹药:装甲厚度小于40%穿深时造成25%伤害,装甲厚度大于50%穿深小于100%穿深时造成100%伤害,未击穿不造成伤害。在入射角小于30度时跳弹,不造成伤害。

ST弹药:无视装甲厚度,但是受鱼雷伤害减免影响。入射角小于10度时跳弹。

DT弹药:无视装甲厚度,但是受鱼雷伤害减免影响。入射角小于10度时跳弹。只能攻击CV/CA/BB,对CL/DD无伤害。


第一行为战舰信息,格式为

船只类型 装甲厚度 最大血量 鱼雷伤害减免(百分比)

此后有n(n<20)行攻击信息,格式为

弹药类型 伤害 穿深(鱼雷为32767) 入射角(仅供计算跳弹使用)

以0 0 0 0标记输入结束,题目保证所有数据在int范围内。

船只剩余血量。如果船只已被击沉(血量<=0),输出“The ship has been sunk”,否则输出船只当前血量。
DD 20 10000 0
DT 5400 32767 24
AP 2300 320 10
AP 2300 320 25
ST 3000 32767 90
HE 900 130 52
0 0 0 0
6100

代码很长,函数很多,尽量OOP。



#include<cstdio>
#include<cstring>
class ship_info
{
public:
    int HP; /* 血量 */
    enum type_{CV,CA,CL,BB,DD} type; /* 船只类型 */
    int armor_thickness; /* 装甲厚度 */
    double damage_reduction; /* 鱼雷伤害减免 */
    inline void typeSet_(const char*);
    inline bool sinked();
    inline void heat(const class ammo_info);
};
class ammo_info
{
public:
    enum type_{AP,HE,ST,DT} type; /* 弹药类型 */
    int hurt; /* 伤害 */
    int PD; /* 穿深 */
    int AOI; /* 入射角 */
    void typeSet_(const char*);
};

/* 想什么呢,你以为我会给你标程?自己去写函数定义! */

int main()
{
    using namespace std;
    ship_info ship;
    ammo_info ammo;
    char a[3];
    scanf("%s %d %d %lf", a, &ship.armor_thickness, &ship.HP, &ship.damage_reduction);
    ship.damage_reduction /= 100;
    ship.typeSet_(a);
    while (getchar() != EOF)
    {
        scanf("%s %d %d %d", a, &ammo.hurt, &ammo.PD, &ammo.AOI);
        if (!strcmp(a, "0")) break;
        ammo.typeSet_(a);
        ship.heat(ammo);
    }
    if (ship.sinked()) puts("The ship has been sunk");
    else printf("%d\n", ship.HP);
    return 0;
}

推荐代码 查看3844 所有题解 上传题解视频得图灵币

本题记录 用 户(点击查看用户) 运行号(点击购买题解) 时 间
算法最快[$ $ms]
内存最少[$ $KB]
第一AC
第一挑战

赛题来源/所属竞赛 N/A

竞赛编号 竞赛名称 竞赛时间 访问比赛