模拟题写起来比较繁琐,也比较耗时,比赛时写了一个多小时(菜的缘故)
题意很长,但读完很清晰,有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