1. 程式人生 > 實用技巧 >2020牛客暑期多校訓練營(第十場) D-Hearthstone Battlegrounds(大模擬)

2020牛客暑期多校訓練營(第十場) D-Hearthstone Battlegrounds(大模擬)

2020牛客暑期多校訓練營(第十場) D-Hearthstone Battlegrounds

題意: 酒館戰棋共有四種怪,規定亡語會出一個\(1/1\)的白板植物(不是兩個)

  1. \(1/ 10^9\)的聖盾劇毒亡語
  2. \(1/ 10^9\)的聖盾劇毒
  3. \(1/ 10^9\)的劇毒亡語
  4. \(1/ 10^9\)的劇毒

現在給出雙方4種怪的數量,總和不超過\(5\cdot 10^6\)(當然不是7個)
我方一定打出完美團(對面一定全員內鬼),問是否能夠取勝。

題解: 如果我們有植物,那麼優先白嫖掉對面的盾。如果對面有植物,那麼我們就用劇毒白吃掉對面的植物。由於不帶亡語的劇毒怪死了之後場上就直接少了一個怪,所以我們的不帶亡語劇毒怪統一留到最後進行處理。而植物能優先嫖掉對面的盾,所以我們要優先把亡語撞出來。所以我方的攻擊策略優先順序為1.劇毒亡語2.聖盾劇毒亡語3.聖盾劇毒4.劇毒。攻擊對方的策略為1.劇毒亡語2.劇毒3.聖盾劇毒亡語4.聖盾劇毒。因為對面的盾一定是留在後面等我們把亡語生出來之後再被破的,而讓對面的亡語早點生出來也可以讓我們的不帶盾的魚人早點白嫖植物,拖一個輪次。然後一直模擬就完事了。最後如果兩方魚人都A完了,就比較一下誰的植物多就可以了。

Accept Code:

#include <bits/stdc++.h>
using namespace std;

int a,a0,a1,a2,a3,b,b0,b1,b2,b3,x,y;//3:聖盾劇毒亡語 2:聖盾劇毒 1:劇毒亡語 0:劇毒 a自己魚人總和 b對面魚人總和 x:我方植物 y:敵方植物
bool check(){
    while(a&&b){
        if(a0||a1) y=0;//我方不帶盾魚人白吃對面植物
        while(x&&(b3||b2)){//我方植物白嫖對面聖盾
            if(b3) b3--,b1++;
            else b2--,b0++;
            x--;
        }
        if(b1&&a-a0){//我方魚人和對面劇毒亡語一換一
            if(a1)a1--,a--,x++;//劇毒亡語換
            else if(a3)a3--,a1++;//聖盾劇毒亡語換
            else if(a2)a2--,a0++;//聖盾劇毒換
            //else a0--,a--;//劇毒換
            b1--,y++,b--;//對面亡語出植物
        }else if(b0&&a-a0){//我方魚人和對面劇毒一換一
            if(a1)a1--,a--,x++; //劇毒亡語換
            else if(a3)a3--,a1++;//聖盾劇毒亡語換
            else if(a2)a2--,a0++;//聖盾劇毒換
            //else a0--,a--;//劇毒換
            b0--,b--;//直接死
        }else if(b3&&a-a0){//我方怪破帶亡語的盾
            if(x)x--;//植物破盾
            else if(a1)a1--,a--,x++;//劇毒亡語換
            else if(a3)a3--,a1++;//聖盾劇毒亡語換
            else if(a2)a2--,a0++;//聖盾劇毒換
            //else a0--,a--;//劇毒換
            b3--,b1++;//破盾
        }else if(b2&&a-a0){//我方怪破盾
            if(x)x--;//植物破盾
            else if(a1)a1--,a--,x++;//劇毒亡語換
            else if(a3)a3--,a1++;//聖盾劇毒亡語換
            else if(a2)a2--,a0++;//聖盾劇毒換
            //else a0--,a--;//劇毒換
            b2--,b0++;//破盾
        }else{//留下的劇毒和對面換
            if(b1) b1--,b--,y++;//劇毒撞出亡語
            else if(b0) b0--,b--;//一換一
            else if(b3) b3--,b1++;//劇毒撞盾留亡語
            else if(b2) b2--,b0++;//劇毒破盾
            a0--,a--;//我方劇毒死
        }
        if(a0||a1) y=0;//白吃植物
    }
    if(a) return true;//我方還有怪
    if(b) return false;//對面還有怪
    return x>y;//植物一換一
}
int main(){
    int t; cin>>t;
    while(t--){
        x=y=0;
        cin>>a3>>a2>>a1>>a0>>b3>>b2>>b1>>b0;
        a=a0+a1+a2+a3,b=b0+b1+b2+b3;
        puts(check()?"Yes":"No");
    }
}