这个题本身描述应该是不清的,让别人全靠数据瞎摸索的小屁孩题。

并不是每个随从都激发一次免费技能,而是这一回合本方死了任意个随从激发一次,对方死了任意个随从激发一次。

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

int m,n,q,mv[9],nv[9];

void read(){
    cin>>m>>n>>q;
    for(int i=0;i<m;i++){
        cin>>mv[i];
    }
    for(int i=0;i<n;i++){
        cin>>nv[i];
    }
}

bool math(){
    int mp=0,np=0;        //最小值所在下标 
    int cnt=0;            //技能+免费技能 
    sort(mv,mv+m);        //排序易于计算 
    sort(nv,nv+n);
    while(q>0&&np<n){    //还有技能并且还没打败 
        q--;            //开一下头
        int cur=1;        //本次用了多少个技能(+免费) 
        for(int i=1;i<=cur;i++){    //用到没了 
            if(mv[mp]-cnt-i==0){    //减没了一个 
                cur++;                    //增加一次 
                mp++;                    //减下一个 
            }
            if(nv[np]-cnt-i==0){
                cur++;
                np++;
            }
        }
        cnt+=cur;                    //本次产生的技能数 
        cout<<cnt<<"--"<<np<<endl;
    }
    return nv[n-1]<=cnt;        //对方全灭 
}

int main(){
    int t;
    cin>>t;
    while(t--){
        read();
        if(math()){
            cout<<"Legendary"<<endl;
        }else{
            cout<<"GG"<<endl;
        }
    }
    return 0;
}

从AC代码逻辑可以看出,是当这个随从的血量减去过去的减血和当前的连续减血==0时,所以当一群随从都是1时,第二个随从在计算时该值<0,白死而已。

如果按题面描述,不分敌我,死了一个激活一次免费技能,那么下面的代码应该可以正确工作:

bool math(){
    int p=0;
    sort(v+1,v+x+1);        //排序易于计算 
    for(p=1;p<=x;p++){
        if(v[p]<=q){
            q++;
        }
    }
    return v[n-1]<=q;        //对方全灭 
}

如果不分阵营只激发一次,那么下面代码可以AC:

bool math(){
    int p=0;
    sort(v+1,v+x+1);        //排序易于计算 
    for(p=1;p<=x;p++){
        if(v[p]<=q && v[p]!=v[p-1]){
            q++;
        }
    }
    return v[n-1]<=q;        //对方全灭 
}

事实是什么呢?

出题如戏,全靠演技,数据入海,全都靠猜。