2019沈阳icpc网络赛H德州扑克
题面:https://nanti.jisuanke.com/t/41408
题意:A,2,3,4,5,6,7,8,9,10,J,Q,K,13张牌,无花色之分,val为1~13。
给n个人名+n个牌,输出人名的ranklist
比较规则:
皇家顺最大
顺子第二,都是顺看最大牌的val
四条第三,先看四张相同牌的val,再看剩下那张牌的val
葫芦第四,先看三张相同牌的val,再看两张相同牌的val
三条第五,先看三张相同牌的val,再看剩下两张牌的val之和
两对第六,先看大的两张相同牌的val,再看小的两张相同牌的val,再看剩下一张牌的val
一对第七,先看两张相同牌的val,再看剩下三张牌的val之和
高牌第八,看五张牌的val之和
比较完还分不出来两幅牌谁赢,看名字,字典序小的赢(不会有相同的名字)。
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f typedef long long ll; const int maxn=1e5+500; struct node { string name; int ranks; int val; int a[50]; }p[maxn]; pair<int,int> calrank(int e,int d,int c,int b,int a) { //a>=b>=c>=d>=e pair<int,int> pa; if(a==13&&b==12&&c==11&&d==10&&e==1){pa.first=0;pa.second=13;} else if(a-b==1&&b-c==1&&c-d==1&&d-e==1){pa.first=1;pa.second=a;} else if(b==e){pa.first=2;pa.second=b*100+a;} else if(a==d){pa.first=2;pa.second=a*100+e;} else if(a==c&&d==e){pa.first=3;pa.second=a*100+d;} else if(a==b&&c==e){pa.first=3;pa.second=c*100+a;} else if(a==c){pa.first=4;pa.second=a*100+d+e;} else if(b==d){pa.first=4;pa.second=b*100+a+e;} else if(c==e){pa.first=4;pa.second=c*100+a+b;} else if(a==b&&c==d){pa.first=5;pa.second=a*10000+c*100+e;} else if(a==b&&d==e){pa.first=5;pa.second=a*10000+e*100+c;} else if(b==c&&d==e){pa.first=5;pa.second=b*10000+d*100+a;} else if(a==b){pa.first=6;pa.second=a*100+c+d+e;} else if(b==c){pa.first=6;pa.second=b*100+a+d+e;} else if(c==d){pa.first=6;pa.second=c*100+a+b+e;} else if(d==e){pa.first=6;pa.second=d*100+a+b+c;} else{pa.first=7;pa.second=a+b+c+d+e;} return pa; } bool cmp(node a,node b) { if(a.ranks==b.ranks) { if(a.val==b.val)return a.name<b.name; return a.val>b.val; } else return a.ranks<b.ranks; } bool cmp2(int a,int b) { return a<b; } int main() { ios::sync_with_stdio(false); int n; while(cin>>n) { for(int i=1;i<=n;i++) { string pai; cin>>p[i].name>>pai; for(int k=0,j=0;pai[k];k++) { if(pai[k]=='0')continue; if(pai[k]>='2'&&pai[k]<='9')p[i].a[j]=pai[k]-48; else if(pai[k]=='A')p[i].a[j]=1; else if(pai[k]=='J')p[i].a[j]=11; else if(pai[k]=='Q')p[i].a[j]=12; else if(pai[k]=='K')p[i].a[j]=13; else if(pai[k]=='1')p[i].a[j]=10; j++; } sort(p[i].a,p[i].a+5,cmp2); pair<int,int>pa2; pa2=calrank(p[i].a[0],p[i].a[1],p[i].a[2],p[i].a[3],p[i].a[4]); p[i].ranks=pa2.first; p[i].val=pa2.second; } sort(p+1,p+n+1,cmp); for(int i=1;i<=n;i++) cout<<p[i].name<<endl; } return 0; }
我太难了
...