---
# System prepended metadata

title: 迴圈英雄
tags: [MDCPP題目題解]

---

###### tags: `MDCPP題目題解`


# 迴圈英雄

## 題敘:

有一款叫迴圈英雄的遊戲
![](https://i.imgur.com/bTiDm7h.png =450x)

遊戲的玩法是這樣，
玩家操作一個英雄，在迴圈裡一直繞圈
![](https://i.imgur.com/r4FDgBw.jpg =450x)

在繞圈的過程中，英雄會遇到各種不同的怪物
打敗怪物後，可能會掉落 **裝備** 或是 **卡片**

有 3 種裝備: 武器、盾牌、護甲
武器對應到 **攻擊** 屬性
盾牌對應到 **防禦** 屬性
護甲對應到 **生命值** 屬性

**一開始英雄並無裝備**
**每獲得一個新的裝備，可以擇優穿戴**
**一種裝備只能穿一個**

每張卡片會有一種屬性：攻擊 / 防禦 / 生命值 **其中之一**。
當英雄使用卡片，接下來所有獲得的對應裝備就可以被卡片增益，也就是對應到的屬性值可以提升，並且卡片能力可以累加。

在 $N$ 圈後，之後英雄會遭遇
攻擊力 $A$
防禦力 $D$
生命值 $H$ 的魔王
當英雄殺死魔王的時間，比魔王殺死英雄更短時，英雄即勝利

也就是 **魔王生命值/英雄傷害 < 英雄生命值/魔王傷害**
$H/(英雄攻擊力-D) < 英雄生命值/(A-英雄防禦力)$ 
( 須注意小數的情況 )

若英雄攻擊力 $\leq$ 魔王防禦力 $D$ 的話，則無法攻擊，
同理，若 魔王攻擊力 $A$ $\leq$ 英雄防禦力 的話，也無法攻擊。

英雄若**無法殺死魔王**或**被魔王殺死**，則失敗，請判斷英雄是否能獲勝 ?

![](https://i.imgur.com/HaQkltT.png =450x)

## 輸入說明:

第一行 有 1 個數字$N$，代表迴圈數
第一行 有 3 個數字$A,D,H$，代表魔王攻擊力、防禦、生命值
接下來$N$個區塊
每個區塊的第1行有一個數字$M$代表怪物的數量
接下來$M$行
每行有三個數字$a,b,c$
$a=1$ 代表怪物掉落裝備，$a=2$ 代表怪物掉落卡片
$b=1$代表怪物掉落武器 / 攻擊卡片
$b=2$代表怪物掉落盾牌 / 防禦卡片
$b=3$代表怪物掉落護甲 / 生命卡片
$c$則是屬性的數值

$1 \leq N \leq 10^5$
$1 \leq M \leq 10$
$1 \leq A, D, H \leq 10^9$
$1 \leq c \leq 100$

## 輸出說明:

如果英雄打敗魔王
輸出"Congratulation"
如果打輸
輸出"YOU DIED"

## 範例測資:

### 輸入
```
5
50 50 50
1
1 1 40
1
2 1 20
1
1 2 30
1
1 3 60
1 
1 1 40

```

### 輸出

```
YOU DIED
```

## Hint:

範測1中

遇到的5次情況為
裝備(攻擊/防禦/生命)、累積卡片加成 (攻擊/防禦/生命)
(40,0,0)、(0,0,0)
(40,0,0)、(20,0,0)
(40,30,0)、(20,0,0)
(40,30,60)、(20,0,0)
(60,30,60)、(20,0,0) 換到更好的武器(本40+卡20=60)

英雄最終的屬性為
攻60 防30 命60
魔王屬性為
攻50 防50 命50

50/(60-50) = 5 > 60/(50-30) = 3
因此英雄挑戰失敗

# 題解

這題就像題目講的，是個迴圈裸題
我們只要記錄下英雄的屬性值、卡片的加成值
然後在每次遇到新裝備時，把裝備加上卡片累積的加成
接者跟英雄身上的裝備比較，選擇更好的那個
最後跟魔王打架的時候，就可以知道能不能打贏了

要注意的是:
如果單純用題目給的式子會出現負數，因此要先判定題目寫到的

如果 $英雄攻擊力 <= D$ 英雄失敗(英雄傷害0)
如果 $A <= 英雄防禦力$ 英雄成功(魔王傷害0)
如果上述兩者同時存在，則英雄失敗(打不死魔王)

沒判定就會爛掉

```cpp=
#include<bits/stdc++.h>
#define long long
using namespace std;

signed main(){


int n;
cin>>n;
double Boss_A,Boss_D,Boss_H;
double Hero_A=0,Hero_D=0,Hero_H=0;
double Add_A=0,Add_D=0,Add_H=0;
cin>>Boss_A>>Boss_D>>Boss_H;

for(int i=1;i<=n;i++){
    int m;
    cin>>m;
    for(int j=1;j<=m;j++){
        int a,b,c;
        cin>>a>>b>>c;
        if(a==1){
            if(b==1) Hero_A = max(Hero_A, c+Add_A); //讓英雄拿最好的裝備
            if(b==2) Hero_D = max(Hero_D, c+Add_D);
            if(b==3) Hero_H = max(Hero_H, c+Add_H);
        }
        else{
            if(b==1) Add_A += c; // 卡片累加
            if(b==2) Add_D += c;
            if(b==3) Add_H += c;
        }
    }
}
// 要先判定可能會出現負數的情況
if(Hero_A<=Boss_D&&Boss_A<=Hero_D) 
    cout<<"YOU DIED"<<endl;
else if(Hero_A<=Boss_D)
    cout<<"YOU DIED"<<endl;
else if(Boss_A<=Hero_D)
    cout<<"Congratulation"<<endl;
else{

    double b = Boss_H/(Hero_A-Boss_D);
    double h = Hero_H/(Boss_A-Hero_D);

    if(b<h) cout<<"Congratulation"<<endl;
    else cout<<"YOU DIED"<<endl;

}

}

```