网易第三题-炉石传说(鴏麚斖縩韠)

//模拟题,遍历攻击0,1,2次后需要多少个亵渎才能解完,然后与8对比
#include <iostream>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
const int N = 15;
struct kk{
    ll dun;
    ll chaofeng;
    ll att;
    ll defen;
}k[N],l[N],tmpk[N],tmpl[N];
vector<kk>ve;
int visk[N],visl[N];
int m,n;
ll niule=8;
ll ans;
void solve(string str,int index,int type){
    kk tmp;
    tmp.chaofeng=0;
    tmp.dun=0;
    if(str[str.length()-1]=='!'){
        tmp.chaofeng=1;
    }
    if(str[0]=='('){
        tmp.dun=1;
    }
    for(int i=0;i<str.length();i++){
        if(str[i]=='('||str[i]==')'||str[i]=='!'){
            str[i]=' ';
        }
    }
    ll att,defen;
    att=defen=0;
    int flag=0;
    for(int i=0;i<str.length();i++){
        if(str[i]>='0'&&str[i]<='9'){
            if(flag==0){
                att=att*10+int(str[i]-'0');
            }else{
                defen=defen*10+int(str[i]-'0');
            }
        }
        if(str[i]=='/'){
            flag=1;
        }
    }
    tmp.att=att;
    tmp.defen=defen;
    if(type==1){
        k[index].chaofeng=tmp.chaofeng;
        k[index].dun=tmp.dun;
        k[index].att=tmp.att;
        k[index].defen=tmp.defen;
    }else{
        l[index].chaofeng=tmp.chaofeng;
        l[index].dun=tmp.dun;
        l[index].att=tmp.att;
        l[index].defen=tmp.defen;
    }
}
ll dfs_xiedu(){
    // cout<<ve.size()<<endl;
    ll num=0;
    for(int i=0;i<ve.size();i++){
        if(ve[i].dun==1){
            ve[i].dun=0;
            ve[i].defen++;
        }
    }
    while(1){
        num++;
        while(1){
            int flag=0;
            for(int i=0;i<ve.size();i++){
                ve[i].defen--;
                if(ve[i].defen==0){
                    flag=1;
                }
            }
            if(flag==0)break;
        }


        int flag2=0;
        for(int i=0;i<ve.size();i++){
            if(ve[i].defen>0){
                flag2=1;
            }
        }
        if(flag2==0)break;
    }
    return num;
}
void l_attack_k(int x,int y){
    int exi_chaofeng=0;
    for(int i=1;i<=m;i++){
        tmpk[i].chaofeng=k[i].chaofeng;
        tmpk[i].dun=k[i].dun;
        tmpk[i].att=k[i].att;
        tmpk[i].defen=k[i].defen;
        if(tmpk[i].chaofeng==1){
            exi_chaofeng=1;
        }
    }
    for(int i=1;i<=n;i++){
        tmpl[i].chaofeng=l[i].chaofeng;
        tmpl[i].dun=l[i].dun;
        tmpl[i].att=l[i].att;
        tmpl[i].defen=l[i].defen;
    }
    if(exi_chaofeng==1&&tmpk[y].chaofeng==0)return;
    if(tmpl[x].dun==1){
        if(tmpk[y].att!=0)tmpl[x].dun=0;


        if(tmpk[y].dun==1){
            tmpk[y].dun=0;
        }else{
            tmpk[y].defen-=tmpl[x].att;
        }
    }else{
        tmpl[x].defen-=tmpk[y].att;
        if(tmpk[y].dun==1){
            tmpk[y].dun=0;
        }else{
            tmpk[y].defen-=tmpl[x].att;
        }
    }
    ve.clear();
    for(int i=1;i<=m;i++){
        ve.push_back(tmpk[i]);
    }
    for(int i=1;i<=n;i++){
        ve.push_back(tmpl[i]);
    }
    ll nums=dfs_xiedu();
    // cout<<"nums"<<' '<<nums<<endl;
    nums=nums*2;
    ans=min(min(ans,nums),niule);
    // return ans;
    // ans=min(1+nums*2,niule);
}
void ip_attack_jq(int x1,int y1,int x2,int y2){
    int exi_chaofeng=0;
    for(int i=1;i<=m;i++){
        tmpk[i].chaofeng=k[i].chaofeng;
        tmpk[i].dun=k[i].dun;
        tmpk[i].att=k[i].att;
        tmpk[i].defen=k[i].defen;
        if(tmpk[i].chaofeng==1){
            exi_chaofeng=1;
        }
    }
    for(int i=1;i<=n;i++){
        tmpl[i].chaofeng=l[i].chaofeng;
        tmpl[i].dun=l[i].dun;
        tmpl[i].att=l[i].att;
        tmpl[i].defen=l[i].defen;
    }
    if(exi_chaofeng==1&&tmpk[y1].chaofeng==0)return;
    if(tmpl[x1].dun==1){
        if(tmpk[y1].att!=0)tmpl[x1].dun=0;
        if(tmpk[y1].dun==1){
            tmpk[y1].dun=0;
        }else{
            tmpk[y1].defen-=tmpl[x1].att;
        }
    }else{
        tmpl[x1].defen-=tmpk[y1].att;
        if(tmpk[y1].dun==1){
            tmpk[y1].dun=0;
        }else{
            tmpk[y1].defen-=tmpl[x1].att;
        }
    }
    int exi_chaofeng2=0;
    for(int i=1;i<=m;i++){
        if(tmpk[i].chaofeng==1&&tmpk[i].defen>0){
            exi_chaofeng2=1;
        }
    }
    if(tmpk[y2].defen<0)return ;
    if(exi_chaofeng2==1&&tmpk[y2].chaofeng==0)return;
////
    if(tmpl[x2].dun==1){
        if(tmpk[y2].att!=0)tmpl[x2].dun=0;
        if(tmpk[y2].dun==1){
            tmpk[y2].dun=0;
        }else{
            tmpk[y2].defen-=tmpl[x2].att;
        }
    }else{
        tmpl[x2].defen-=tmpk[y2].att;
        if(tmpk[y2].dun==1){
            tmpk[y2].dun=0;
        }else{
            tmpk[y2].defen-=tmpl[x2].att;
        }
    }
    ve.clear();
    for(int i=1;i<=m;i++){
        ve.push_back(tmpk[i]);
    }
    for(int i=1;i<=n;i++){
        ve.push_back(tmpl[i]);
    }
    ll nums=dfs_xiedu();
    // cout<<"nums"<<' '<<nums<<endl;
    nums=nums*2;
    ans=min(min(ans,nums),niule);
}
int main(){
    int t;cin>>t;
    while(t--){
        memset(visk,0,sizeof(visk));
        memset(visl,0,sizeof(visl));
        cin>>m;
        for(int i=1;i<=m;i++){
            string tmp;cin>>tmp;
            solve(tmp,i,1);
        }
        cin>>n;
        for(int i=1;i<=n;i++){
            string tmp;cin>>tmp;
            solve(tmp,i,2);
        }
        // for(int i=1;i<=m;i++){
        //     cout<<k[i].dun<<' '<<k[i].chaofeng<<' '<<k[i].att<<' '<<k[i].defen<<endl;
        // }
        // for(int i=1;i<=n;i++){
        //     cout<<l[i].dun<<' '<<l[i].chaofeng<<' '<<l[i].att<<' '<<l[i].defen<<endl;
        // }
        ve.clear();
        for(int i=1;i<=m;i++){
            ve.push_back(k[i]);
        }
        for(int i=1;i<=n;i++){
            ve.push_back(l[i]);
        }
        ll nums=dfs_xiedu();
        // cout<<"nums  "<<nums<<endl;
        ans=min(nums*2,niule);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(l[i].att!=0){
                    l_attack_k(i,j);
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                for(int p=1;p<=n;p++){
                    for(int q=1;q<=m;q++){
                        if(l[i].att==0||l[p].att==0)continue;
                        if(i!=p){
                            ip_attack_jq(i,j,p,q);
                        }
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
}


// 2
// 2
// 2/9! (8/6)!
// 0


// 3
// 8/1 (1/6) (8/7)!
// 5
// (1/2)! (8/5)! (2/1) (3/4)! (9/9)

全部评论

相关推荐

3 3 评论
分享
牛客网
牛客企业服务