大模拟求卡常 但卡出来v你50
  • 板块学术版
  • 楼主___A__
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/8/9 20:35
  • 上次更新2024/8/9 21:00:00
查看原帖
大模拟求卡常 但卡出来v你50
275860
___A__楼主2024/8/9 20:35

HDU7509

现在单组要13秒 但5组只给了20秒 或者说可以优化?

#include<bits/extc++.h>
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
using namespace std;using namespace __gnu_pbds;
struct card{
    int bel,id;
};
unsigned strhash(vector<string>x){
    unsigned ret=0;
    for(auto i:x){
        for(auto j:i){
            ret=ret*1131+j;
        }
    }
    return ret;
}
gp_hash_table<unsigned,int>DICTATION,SCORE;
char huase[]={'H','D','C','S'},daxiao[]={'A','K','Q','J','T','9','8','7','6','5','4','3','2'};
string pai[100][100];
int T;
vector<string>table;
int fenshu[200];
int anpaidaxiaopaixudange(string x,string y){
    char A=x[0],B=y[0];
    return fenshu[A]>fenshu[B];
}
int tonghuashun(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    for(int i=1;i<x.size();i++){
        if(x[0][1]!=x[i][1]){
            return 0;
        }
    }
    if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
        return 1;
    }
    //现在 我们的花色相同
    for(int i=1;i<x.size();i++){
        if(fenshu[x[i-1][0]]-fenshu[x[i][0]]!=1){
            return 0;
        }
    }
    return 1;
}
int huangjiatonghuashun(vector<string>x){
    if(!tonghuashun(x)){
        return 0;
    }
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    return x.back()[0]=='A';
}
int sitiao(vector<string>x){
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        if(j==4){
            return 1;
        }
    }
    return 0;
}
int zuidasitiao(vector<string>x){
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        if(j==4){
            return i;
        }
    }
}
int hulu(vector<string>x){
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    vector<int>vec;
    for(auto [i,j]:mp){
        vec.push_back(j);
    }
    if(vec[0]==2&&vec.back()==3){
        return 1;
    }
    reverse(vec.begin(),vec.end());
    if(vec[0]==2&&vec.back()==3){
        return 1;
    }
    return 0;
}
int zuidasanpai(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    return fenshu[x[0][0]];
}
int zuidahulu(vector<string>x){
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        if(j==3){
            return fenshu[i];
        }
    }
}
int tonghua(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    for(int i=1;i<x.size();i++){
        if(x[0][1]!=x[i][1]){
            return 0;
        }
    }
    return 1;
}
int zuidatonghua(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    return fenshu[x[0][0]];
}
int zuidashunzi(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
        return -1;
    }
    //现在 我们的花色相同
    return fenshu[x[0][0]];
}
int zuidasantiao(vector<string>x){
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        if(j==3){
            return i;
        }
    }
}
int shunzi(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
        return 1;
    }
    //现在 我们的花色相同
    for(int i=1;i<x.size();i++){
        if(fenshu[x[i-1][0]]-fenshu[x[i][0]]!=1){
            return 0;
        }
    }
    return 1;
}
int santiao(vector<string>x){
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        if(j==3){
            return 1;
        }
    }
    return 0;
}
int liangdui(vector<string>x){
    vector<int>vec;
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        vec.push_back(j);
    }
    sort(vec.begin(),vec.end());
    if(vec.size()<3){
        return 0;
    }
    return vec[0]==1&&vec[1]==2&&vec[2]==2;
}
int zuidaliangdui(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    return fenshu[x[0][0]];
}
int zuidaduizi(vector<string>x){
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        if(j==2){
            return fenshu[i];
        }
    }
}
int duizi(vector<string>x){
    vector<int>vec;
    map<int,int>mp;
    for(auto i:x){
        mp[i[0]]++;
    }
    for(auto [i,j]:mp){
        vec.push_back(j);
    }
    sort(vec.begin(),vec.end());
    if(vec.size()<4){
        return 0;
    }
    return vec[0]==1&&vec[1]==2&&vec[2]==1&&vec[3]==2;
}
int Fenshu(vector<string>x){
    if(SCORE.find(strhash(x))!=SCORE.end()){
        return SCORE[strhash(x)];
    }
    if(huangjiatonghuashun(x)){
        return SCORE[strhash(x)]=10;
    }
    if(tonghuashun(x)){
        return SCORE[strhash(x)]=9;
    }
    if(sitiao(x)){
        return SCORE[strhash(x)]=8;
    }
    if(hulu(x)){
        return SCORE[strhash(x)]=7;
    }
    if(tonghua(x)){
        return SCORE[strhash(x)]=6;
    }
    if(shunzi(x)){
        return SCORE[strhash(x)]=5;
    }
    if(santiao(x)){
        return SCORE[strhash(x)]=4;
    }
    if(liangdui(x)){
        return SCORE[strhash(x)]=3;
    }
    if(duizi(x)){
        return SCORE[strhash(x)]=2;
    }
    return SCORE[strhash(x)]=1;
}
vector<string>get(int x){
    for(int i=0;i<2;i++){
        table.push_back(pai[x][i]);
    }
    auto ret=table;
    for(int i=0;i<2;i++){
        table.pop_back();
    }
    return ret;
}
int score(int now,int num,vector<string>table,vector<string>Now){
    if(num>5){
        return -1919810;
    }
    if(num+7-now<5){
        return -1919810;
    }
    if(now==6){
        return Fenshu(Now);
    }
    int ret=score(now+1,num,table,Now);
    Now.push_back(table[now]);
    ret=max(ret,score(now+1,num+1,table,Now));
    return ret;
}
int zuidatonghuashun(vector<string>x){
    sort(x.begin(),x.end(),anpaidaxiaopaixudange);
    for(int i=1;i<x.size();i++){
        if(x[0][1]!=x[i][1]){
            return 0;
        }
    }
    if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
        return -114514;
    }
    return fenshu[x[0][0]];
}
int diction(vector<string>x){
    if(DICTATION.find(strhash(x))!=DICTATION.end()){
        return DICTATION[strhash(x)];
    }
    if(huangjiatonghuashun(x)){
        return DICTATION[strhash(x)]=114514;
    }
    if(tonghuashun(x)){
        return DICTATION[strhash(x)]=zuidatonghuashun(x);
    }
    if(sitiao(x)){
        return DICTATION[strhash(x)]=zuidasitiao(x);
    }
    if(hulu(x)){
        return DICTATION[strhash(x)]=zuidahulu(x);
    }
    if(tonghua(x)){
        return DICTATION[strhash(x)]=zuidatonghua(x);
    }
    if(shunzi(x)){
        return DICTATION[strhash(x)]=zuidashunzi(x);
    }
    if(santiao(x)){
        return DICTATION[strhash(x)]=zuidasantiao(x);
    }
    if(liangdui(x)){
        return DICTATION[strhash(x)]=zuidaliangdui(x);
    }
    if(duizi(x)){
        return DICTATION[strhash(x)]=zuidaduizi(x);
    }
    return DICTATION[strhash(x)]=zuidasanpai(x);
}
int canbeat(int a,int b){
    vector<string>em;
    int A=score(0,0,get(a),em),B=score(0,0,get(b),em);
    if(A!=B){
        return A>B;
    }
    return diction(get(a))>diction(get(b));
}
void Flop(pair<int,int>x,pair<int,int>y){
    auto [A,B]=x;
    auto [C,D]=y;
    swap(pai[A][B],pai[C][D]);
}
int main(){
    fenshu['2']=1,fenshu['3']=2,fenshu['4']=3,fenshu['5']=4,fenshu['6']=5;
    fenshu['7']=6,fenshu['8']=7,fenshu['9']=8,fenshu['T']=9;
    fenshu['J']=10,fenshu['Q']=11,fenshu['K']=12,fenshu['A']=13;
    cin>>T;
    while(T--){
        vector<string>last;
        table.clear();
        vector<pair<int,int>>all;
        for(int i=0;i<3;i++){
            cin>>pai[0][i],all.push_back({0,i});
        }
        for(int i=1;i<=4;i++){
            for(int j=0;j<2;j++){
                cin>>pai[i][j],all.push_back({i,j});
            }
        }
        for(char i:daxiao){
            for(char j:huase){
                string This;
                This.push_back(i),This.push_back(j);
                int in=1;
                for(int i=0;i<3;i++){
                    if(This==pai[0][i]){
                        in=0;
                    }
                }
                for(int i=1;i<=4;i++){
                    for(int j=0;j<2;j++){
                        if(This==pai[i][j]){
                            in=0;
                        }
                    }
                }
                if(in){
                    last.push_back(This);
                }
            }
        }
        int want;
        cin>>want;
        want++;
        int mx=0;
        int num[100][100]={};//要是交换这两张牌 我能赢几个人
        for(int i=0;i<all.size();i++){
            for(int j=0;j<all.size();j++){
                auto [A,B]=all[i];
                auto [C,D]=all[j];
                if(pai[A][B]>pai[C][D]){
                    continue;
                }
                Flop(all[i],all[j]);
                for(int k=0;k<3;k++){
                    table.push_back(pai[0][k]);
                }
                for(auto A:last){
                    for(auto B:last){
                        if(A!=B){
                            table.push_back(A),table.push_back(B);
                            for(int k=1;k<=4;k++){
                                if(k!=want){
                                    num[i][j]+=canbeat(want,k);
                                }
                            }
                            table.pop_back(),table.pop_back();
                        }
                    }
                }
                for(int k=0;k<3;k++){
                    table.pop_back();
                }
                Flop(all[i],all[j]);
                mx=max(mx,num[i][j]);
            }
        }
        int out=0;
        for(int i=0;i<all.size();i++){
            if(num[i][i]==mx){
                cout<<"None\n";
                out=1;
                break;
            }
        }
        if(!out){
            string ans;
            for(int i=0;i<all.size();i++){
                for(int j=0;j<all.size();j++){
                    auto [A,B]=all[i];
                    auto [C,D]=all[j];
                    if(pai[A][B]<=pai[C][D]&&mx==num[i][j]){
                        string now=pai[A][B]+" "+pai[C][D];
                        if(ans.empty()){
                            ans=now;
                        }
                        ans=min(ans,now);
                    }
                }
            }
            cout<<ans<<'\n';
        }
    }
}

2024/8/9 20:35
加载中...