2019icpc沈阳网络赛H. Texas hold'em Poker (模拟)

模拟题写起来比较繁琐,也比较耗时,比赛时写了一个多小时(菜的缘故

题意很长,但读完很清晰,有n个人,每人5张手牌,按照德州扑克的规则比大小,相同则按名字字典序输出

题目简化了规则,去掉了牌的花色,而且原规则中的剩余单张排序再单张比大小改成了所有单张求和再比较

在所有的牌型中,需要比较次数最多的是Two Pairs:2对一样的手牌,若两人都是Two Pairs,则先比大的对子,若大的对子相同,则比较小的对子,若小的对子相同,则比较剩余的单张。

由此可以总结出,只需要至少四个rank就能将所有牌型的大小排序。

可以用一个结构体给每副牌带四个有优先级的rank,每读入一副牌型就按照规则给四个rank赋值,然后直接按rank顺序sort就行了

上ac代码(菜鸡排版请多见谅)(つд⊂):

  1 #include<bits/stdc++.h>
  2 #define rush() int T; while(~scanf("%d",&T))
  3 using namespace std;
  4 using std::bitset;
  5 typedef long long ll;
  6 
  7 typedef struct
  8 {
  9     string name;
 10     string card;
 11     int rank1;//8类牌型的总rank
 12     int rank2;//相同牌型后的比较规则,不用的赋值为0
 13     int rank3;
 14     int rank4;
 15 }man;
 16 
 17 bool cmp(man a,man b)//sort里按照优先级rank排序的自定义
 18 {
 19     if(a.rank1!=b.rank1)
 20         return a.rank1>b.rank1;
 21     else
 22     {
 23         if(a.rank2!=b.rank2)
 24             return a.rank2>b.rank2;
 25         else
 26         {
 27             if(a.rank3!=b.rank3)
 28                 return a.rank3>b.rank3;
 29             else
 30             {
 31                 if(a.rank4!=b.rank4)
 32                     return a.rank4>b.rank4;
 33                 else
 34                     return a.name<b.name;
 35             }
 36         }
 37     }
 38 }
 39 
 40 man p[100005];
 41 
 42 
 43 int main()
 44 {
 45     rush()
 46     {
 47         for(int i=0;i<T;i++)
 48         {
 49             cin>>p[i].name>>p[i].card;
 50             int fu[2]={1,1};//重复的次数
 51             int f[2]={0,0};//相应的重复的牌
 52             int flg=0;
 53             int sum=0;//5张牌的和
 54             int cd[5];
 55             for(int j=0,q=0;j<p[i].card.length();j++,q++)//输入的字符串转换成数组处理
 56             {
 57                 if(p[i].card[j]=='A')
 58                     cd[q]=1;
 59                 else if(p[i].card[j]=='J')
 60                     cd[q]=11;
 61                 else if(p[i].card[j]=='Q')
 62                     cd[q]=12;
 63                 else if(p[i].card[j]=='K')
 64                     cd[q]=13;
 65                 else if(p[i].card[j]>='2'&&p[i].card[j]<='9')
 66                     cd[q]=p[i].card[j]-'0';
 67                 else if(p[i].card[j]=='1')
 68                 {
 69                     cd[q]=10;
 70                     j++;
 71                 }
 72                 sum+=cd[q];
 73             }
 74             sort(cd,cd+5);
 75             //cout<<cd[0]<<cd[1]<<cd[2]<<cd[3]<<cd[4]<<endl;
 76             for(int j=0,q=0;j<4;j++)//计算五张牌是否有重复及相应的牌
 77             {
 78                 if(cd[j]==cd[j+1])
 79                 {
 80                     fu[q]++;
 81                     flg=1;
 82                     f[q]=cd[j];
 83                 }
 84                 else
 85                 {
 86                     if(flg)
 87                     {
 88                         q++;
 89                         flg=0;
 90                     }
 91                 }
 92             }
 93             //按8种大牌型分别给后面的rank赋值
 94             if(cd[0]==1&&cd[1]==10&&cd[2]==11&&cd[3]==12&&cd[4]==13)
 95             {
 96                 p[i].rank1=8; p[i].rank2=0; p[i].rank3=0; p[i].rank4=0;
 97             }
 98             else if(cd[0]==cd[1]-1&&cd[1]==cd[2]-1&&cd[2]==cd[3]-1&&cd[3]==cd[4]-1)
 99             {
100                 p[i].rank1=7; p[i].rank2=cd[4]; p[i].rank3=0; p[i].rank4=0;
101             }
102             else if(fu[0]==4)
103             {
104                 p[i].rank1=6; p[i].rank2=f[0]; p[i].rank3=sum-4*f[0]; p[i].rank4=0;
105             }
106             else if(fu[0]==2&&fu[1]==3)
107             {
108                 p[i].rank1=5; p[i].rank2=f[1]; p[i].rank3=f[0]; p[i].rank4=0;
109             }
110             else if(fu[0]==3&&fu[1]==2)
111             {
112                 p[i].rank1=5; p[i].rank2=f[0]; p[i].rank3=f[1]; p[i].rank4=0;
113             }
114             else if(fu[0]==3&&fu[1]==1)
115             {
116                 p[i].rank1=4; p[i].rank2=f[0]; p[i].rank3=sum-3*f[0]; p[i].rank4=0;
117             }
118             else if(fu[0]==2&&fu[1]==2)
119             {
120                 p[i].rank1=3; p[i].rank2=f[1]; p[i].rank3=f[0]; p[i].rank4=sum-2*f[0]-2*f[1];
121             }
122             else if(fu[0]==2&&fu[1]==1)
123             {
124                 p[i].rank1=2; p[i].rank2=f[0]; p[i].rank3=sum-2*f[0]; p[i].rank4=0;
125             }
126             else
127             {
128                 p[i].rank1=1; p[i].rank2=sum; p[i].rank3=0; p[i].rank4=0;
129             }
130             //cout<<p[i].rank1<<" "<<p[i].rank2<<" "<<p[i].rank3<<" "<<p[i].rank4<<endl;
131         }
132         sort(p,p+T,cmp);
133         for(int i=0;i<T;i++)
134             cout<<p[i].name<<endl;
135     }
136     return 0;
137 }
View Code

猜你喜欢

转载自www.cnblogs.com/Find-sunrise-dream/p/11546141.html