###### tags: `MDCPP題目題解`
# 迴圈英雄
## 題敘:
有一款叫迴圈英雄的遊戲

遊戲的玩法是這樣,
玩家操作一個英雄,在迴圈裡一直繞圈

在繞圈的過程中,英雄會遇到各種不同的怪物
打敗怪物後,可能會掉落 **裝備** 或是 **卡片**
有 3 種裝備: 武器、盾牌、護甲
武器對應到 **攻擊** 屬性
盾牌對應到 **防禦** 屬性
護甲對應到 **生命值** 屬性
**一開始英雄並無裝備**
**每獲得一個新的裝備,可以擇優穿戴**
**一種裝備只能穿一個**
每張卡片會有一種屬性:攻擊 / 防禦 / 生命值 **其中之一**。
當英雄使用卡片,接下來所有獲得的對應裝備就可以被卡片增益,也就是對應到的屬性值可以提升,並且卡片能力可以累加。
在 $N$ 圈後,之後英雄會遭遇
攻擊力 $A$
防禦力 $D$
生命值 $H$ 的魔王
當英雄殺死魔王的時間,比魔王殺死英雄更短時,英雄即勝利
也就是 **魔王生命值/英雄傷害 < 英雄生命值/魔王傷害**
$H/(英雄攻擊力-D) < 英雄生命值/(A-英雄防禦力)$
( 須注意小數的情況 )
若英雄攻擊力 $\leq$ 魔王防禦力 $D$ 的話,則無法攻擊,
同理,若 魔王攻擊力 $A$ $\leq$ 英雄防禦力 的話,也無法攻擊。
英雄若**無法殺死魔王**或**被魔王殺死**,則失敗,請判斷英雄是否能獲勝 ?

## 輸入說明:
第一行 有 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;
}
}
```