###### 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; } } ```