2019瀋陽網絡賽H-Texas hold'em Poker(大模擬)

題目鏈接-H

 

存每種牌的出現次數,然後從大到小找,用多個ans數組存大小。雖然代碼長但是很穩

WA點:

①10不能算兩個字符,應該拆開考慮

②相同時候,多開個數組記錄。

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

int a[100010][14];
int sum[100010];
string name[100010],val[100010];
struct p{
    string name;
    int ans1,ans2,ans3,ans4;
    //int sum;
    //int a[13];
}p1[100010];

bool cmp(p x,p y){
    if(x.ans1!=y.ans1)return x.ans1<y.ans1;
    else if(x.ans2!=y.ans2)return x.ans2>y.ans2;
    else if(x.ans3!=y.ans3)return x.ans3>y.ans3;
        else if(x.ans4!=y.ans4)return x.ans4>y.ans4;
    else return x.name<y.name;
}

int maxshun(int k){
    if(a[k][1]&&a[k][10]&&a[k][11]&&a[k][12]&&a[k][13])return 1;
    else return -1;
}
int shun(int k){
    for(int i=13;i>=5;i--){
        if(a[k][i]&&a[k][i-1]&&a[k][i-2]&&a[k][i-3]&&a[k][i-4])return i;
    }
 
        return -1;
}
int four(int k){
    for(int i=13;i>=1;i--){
        if(a[k][i]==4)return i;
    }
    return -1;
}
int ful(int k){
    int flag=0;
    int flag1=0;
    for(int i=13;i>=1;i--){
        if(a[k][i]==3)flag=i;
        if(a[k][i]==2)flag1=i;
    
    }
    if(flag1&&flag)return flag;
    return -1;
}
int three(int k){
    for(int i=13;i>=1;i--){
        if(a[k][i]==3)return i;
    }
    return -1;
}
int twop(int k){
    int flag=0;
    int max1=-1;
    for(int i=13;i>=1;i--){
        if(a[k][i]==2)max1=max(i,max1),flag++;
    }
    if(flag==2)return max1;
    else return -1;
}
int two(int k){
    for(int i=13;i>=1;i--){
        if(a[k][i]==2)return i;
    }
    return -1;
}
int sum1(int k){
    int len=(val[k].length());
    for(int i=0;i<len;i++){
        int pos=(int)(val[k][i]-'0');
        if(val[k][i]=='J')a[k][11]++,sum[k]+=11;
        else if(val[k][i]=='Q')a[k][12]++,sum[k]+=12;
        else if(val[k][i]=='K')a[k][13]++,sum[k]+=13;
        else if(val[k][i]=='A')a[k][1]++,sum[k]+=1;
        else if(i<len-1&&val[k][i]=='1'&&val[k][i+1]=='0')a[k][10]++,sum[k]+=10;
        else if(val[k][i-1]=='1'&&val[k][i]=='0')continue;
        else  a[k][pos]++,sum[k]+=pos;
    }
}
int yu(int k,int type1){
    if(type1==3){
        for(int i=13;i>=1;i--){
            if(a[k][i]==1)return i;
        }
    }
    else if(type1==4){
        for(int i=13;i>=1;i--){
            if(a[k][i]==2)return i;
        }
    }
    else if(type1==5){
        int sum=0;
        for(int i=13;i>=1;i--){
            if(a[k][i]==1)sum+=i;
        }
        return sum;
    }
    else if(type1==6){
        for(int i=1;i<=13;i++){
            if(a[k][i]==2)return i;
        }
    }
    else if(type1==7){
        int sum=0;
        for(int i=13;i>=1;i--){
            if(a[k][i]==1)sum+=i;
        }
        return sum;
    }
    else if(type1==8){
        return sum[k];
    }
}

int yu2(int k){
  
        for(int i=13;i>=1;i--){
            if(a[k][i]==1)return i;
        }
    
}
//3
//Alice AAA109
//Bob 678910
//Boa 678910

int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>p1[i].name>>val[i];
        sum1(i);
        if(maxshun(i)!=-1)p1[i].ans1=1;
        else if(shun(i)!=-1)p1[i].ans1=2,p1[i].ans2=shun(i);
        else if(four(i)!=-1)p1[i].ans1=3,p1[i].ans2=four(i),p1[i].ans3=yu(i,3);
        else if(ful(i)!=-1)p1[i].ans1=4,p1[i].ans2=ful(i),p1[i].ans3=yu(i,4);
        else if(three(i)!=-1)p1[i].ans1=5,p1[i].ans2=three(i),p1[i].ans3=yu(i,5);
         else if(twop(i)!=-1)p1[i].ans1=6,p1[i].ans2=twop(i),p1[i].ans3=yu(i,6),p1[i].ans4=yu2(i);
             else if(two(i)!=-1)p1[i].ans1=7,p1[i].ans2=two(i),p1[i].ans3=yu(i,7);
        else p1[i].ans1=8,p1[i].ans2=yu(i,8);
    }
    sort(p1,p1+n,cmp);
 
        for(int i=0;i<n;i++){
            cout<<p1[i].name<<endl;
        }
    
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章