1 条题解

  • 0
    @ 2022-10-15 20:24:47

    这题就是一个很简单但是有点恶心的模拟,因为你要考虑很多状态,然后剩下的根据出牌的卡牌规则走就行了

    然后就是具体状态的判断

    1.防御值要连续存在3个回合才会全部清除,如果你这回合防御值被打空了,你清除防御值的判断就要从下次防御值出现的时候再开始判断

    2.恶魔形态和狂暴状态是发动后下回合才开始生效的。

    3.堡垒状态是发动后立即生效的。

    4.痛击生成的状态,在下次痛击的时候也是会造成双倍伤害的。

    5.当力量值超过10的时候,有关力量的增益卡牌和状态会无效,但不会清除。

    6.堡垒状态若清除是仍然有防御值,需要重新判断防御值清除回合。

    7.血量的话,是先扣防御值,再扣血量。

    然后状态基本上判断也就这么多,具体可以看代码。

    #include<algorithm>
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    using namespace std;
    typedef long long ll;
    int main()
    {
        ll h,d,n;
        scanf("%lld %lld %lld",&h,&d,&n);
        ll emxt=0,kbbuff=0,bl=0,tj=0,kb=0,fy=0,nl=2,sum=0;
        ll zll=1,dll=1,flag=0;
        while(n--)
        {
            ll t;
            string x;
            cin>>t>>x;
            if(flag==1||flag==2)
                continue;
            if(emxt)
                zll=min(ll(10),zll+2);
            if(kbbuff)
                nl+=2;
            if(t==0)
            {
                if(x=="PK")
                {
                    if(tj==1)
                        d-=zll*2*6,tj=0;
                    else
                        d-=zll*6;
                }
                if(x=="FY")
                    fy+=8;
                if(x=="NL")
                    nl+=2;
                if(x=="XJ"&&h>=3)
                    h-=3,nl+=2;
                if(x=="YLBD"&&nl>=2)
                    fy+=30,nl-=2;
                if(x=="TPJX"&&nl>=2&&zll<10)
                    zll=min(ll(10),zll*2),nl-=2;
                if(x=="EMXT"&&nl>=3)
                    emxt=1,nl-=3;
                if(x=="BL"&&nl>=2)
                    bl=1,nl-=2;
                if(x=="TJ"&&nl>=2)
                {
                    if(tj==1)
                        d-=8*zll*2;
                    else
                        d-=8*zll,tj=1;
                    nl-=2;
                }
                if(x=="KB")
                    kb=2,kbbuff=1;
                if(x=="RS"&&nl>=1&&zll<10)
                    zll=min(ll(10),zll+2),nl-=1;
                if(x=="JH"&&nl>=2)
                    dll=1,nl-=2;
            }
            else
            {
                if(x[0]=='S'&&x[1]=='H')
                {
                    ll dx=(x[2]-'0')*dll;
                    if(kb>=1)
                        dx*=2,kb--;
                    if(fy>=dx)
                        fy-=dx;
                    else
                        dx-=fy,fy=0,h-=dx;
                }
                if(x=="QCLL")
                    zll=1;
                if(x=="QCZT")
                    emxt=0,bl=0,kbbuff=0,tj=0,sum=0;
                if(x=="YS")
                    dll=min(ll(10),dll+1);
            }
            if(fy>0)
                sum=min(ll(3),sum+1);
            else
                sum=0;
            if(sum==3&&!bl)
                fy=0,sum=0;
            if(h<=0)
                flag=1;
            if(d<=0)
                flag=2;
        }
        if(flag==1)
            printf("NO %lld",d);
        else
            printf("YES %lld",h);
    }
    

    信息

    ID
    813
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    72
    已通过
    3
    上传者