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

传送门

解:细心的模拟即可。

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define SZ(a) int((a).size())
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int N=1e5+5;
//il int Add(ll &x,ll y) {return x=x+y>=mod?x+y-mod:x+y;}
//il int Mul(ll &x,ll y) {return x=x*y>=mod?x*y%mod:x*y;}
unordered_map<char,int> mp;
struct node {
	string name;
	int type;
	int two1,two2,three,four,shun,sum;
	void clean(){
		name="",type=0,two1=0,two2=0,three=0,four=0,shun=0,sum=0;
	}
} a[N];
bool cmp(node x,node y) {
	if(x.type!=y.type) return x.type>y.type;
	else {
		if(x.type==0) {
			if(x.sum!=y.sum) return x.sum>y.sum;
			else return x.name<y.name;
		} else if(x.type==1) {
			if(x.two1!=y.two1) return x.two1>y.two1;
			else if(x.sum!=y.sum) return x.sum>y.sum;
			else return x.name<y.name;
		} else if(x.type==2) {
			if(x.two2!=y.two2) return x.two2>y.two2;
			else if(x.two1!=y.two1) return x.two1>y.two1;
			else if(x.sum!=y.sum) return x.sum>y.sum;
			else return x.name<y.name;
		} else if(x.type==3) {
			if(x.three!=y.three) return x.three>y.three;
			else if(x.sum!=y.sum) return x.sum>y.sum;
			else return x.name<y.name;
		} else if(x.type==4) {
			if(x.three!=y.three) return x.three>y.three;
			else if(x.two1!=y.two1) return x.two1>y.two1;
			else if(x.sum!=y.sum) return x.sum>y.sum;
			else return x.name<y.name;
		} else if(x.type==5) {
			if(x.four!=y.four) return x.four>y.four;
			else if(x.sum!=y.sum) return x.sum>y.sum;
			else return x.name<y.name;
		} else if(x.type==6) {
			if(x.shun!=y.shun) return x.shun>y.shun;
			else return x.name<y.name;
		} else return x.name<y.name;
	}
}
int n,tt[10],num[15];
int main() {
	std::ios::sync_with_stdio(0);cin.tie(0);
	mp['A']=1,mp['J']=11,mp['Q']=12,mp['K']=13;
	for(char c='1'; c<='9'; ++c) mp[c]=c-'0';
	while(cin>>n) {
		string na,s;
		int cnt=0;
		for(int i=1; i<=n; ++i) {
			cin>>na>>s;
			a[i].name=na;
			cnt=0;
			for(int j=0,len=SZ(s); j<len; ++j) {
				if(j<len-1 && s[j]=='1' && s[j+1]=='0') tt[++cnt]=10,++j;
				else tt[++cnt]=mp[s[j]];
			}
			sort(tt+1,tt+cnt+1);
			if(tt[1]==1 && tt[2]==10 && tt[3]==11 && tt[4]==12 && tt[5]==13) a[i].type=7;
			else {
				int four=0,one=0,two1=0,two2=0,three=0,shun=0,sum=0;
				bool fg=0;
				ms(num,0);
				for(int j=1; j<=cnt; ++j) {
					if(!fg && j>1 && tt[j]-tt[j-1]!=1) fg=1;
					num[tt[j]]++;
					sum+=tt[j];
				}
				if(!fg) {
					a[i].type=6;
					a[i].shun=tt[1];
					continue;
				}
				for(int j=1; j<=13; ++j) {
					if(num[j]==2) {
						if(two1==0) two1=j;
						else two2=j;
						sum-=j*2;
					} else if(num[j]==3) three=j,sum-=3*j;
					else if(num[j]==4) four=j,sum-=4*j;
				}

				if(four!=0) {
					a[i].type=5;
					a[i].four=four;
					a[i].sum=sum;
				} else if(three!=0 && two1!=0) {
					a[i].type=4;
					a[i].three=three,a[i].two1=two1;
				} else if(three!=0) {
					a[i].type=3;
					a[i].three=three,a[i].sum=sum;
				} else if(two1!=0 && two2!=0) {
					a[i].type=2;
					a[i].two1=two1,a[i].two2=two2;
					a[i].sum=sum;
				} else if(two1!=0) {
					a[i].type=1;
					a[i].two1=two1;
					a[i].sum=sum;
				} else {
					a[i].type=0;
					a[i].sum=sum;
				}
			}
		}
		sort(a+1,a+n+1,cmp);
		for(int i=1; i<=n; ++i) {
			cout<<a[i].name<<endl;
		} 
		for(int i=1;i<=n;++i) a[i].clean();
	}

	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值