2019icpc沈阳H Texas hold'em Poker 大模拟

wdnmd,补题一遍过了。
数不清的wa都是过去式,只留下无穷的遗憾。
传送门

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;

const int N = 1e5+10;

class Player{
public:
	string name;
	string str;
	int p[5];
	int rank1, rank2, rank3, rank4;
	
	Player(){
		name = "";
		str = "";
		memset(p, 0, sizeof p);
		rank1 = rank2 = rank3 = rank4 = 0;
	}
	
	friend istream& operator>> (istream& pin, Player& s){
		pin >> s.name >> s.str;
		int pos, cnt = 0;
		while((pos=s.str.find("10")) != string::npos) {
			s.str.erase(pos,2);
			s.p[cnt++] = 10;
		}
		for(int i = 0; i < s.str.size(); i++){
			if(s.str[i]=='A') s.p[cnt++] = 1;
			else if(s.str[i]=='J') s.p[cnt++] = 11;
			else if(s.str[i]=='Q') s.p[cnt++] = 12;
			else if(s.str[i]=='K') s.p[cnt++] = 13;
			else s.p[cnt++] = s.str[i] - '0';
		}
		sort(s.p, s.p+5);
		if(s.p[0]==1&&s.p[1]==10&&s.p[2]==11&&s.p[3]==12&&s.p[4]==13) s.rank1 = 8, s.rank2 = s.rank3 = s.rank4 = 0;//王顺 
		
		else if(s.p[0]+1==s.p[1]&&s.p[1]+1==s.p[2]&&s.p[2]+1==s.p[3]&&s.p[3]+1==s.p[4]) s.rank1 = 7, s.rank2 =s.p[4], s.rank3 = s.rank4 = 0;//顺子 
		
		else if((s.p[0]==s.p[1]&&s.p[1]==s.p[2]&&s.p[2]==s.p[3])||(s.p[1]==s.p[2]&&s.p[2]==s.p[3]&&s.p[3]==s.p[4])){//四连 
			s.rank1 = 6, s.rank2 = s.p[2], s.rank3 = (s.p[0]==s.p[2])?s.p[4]:s.p[0], s.rank4 = 9;;
		}
		
		else if((s.p[0]==s.p[1] && s.p[2]==s.p[3] && s.p[3]==s.p[4] && s.p[0]!=s.p[4])||(s.p[0]==s.p[1] && s.p[1]==s.p[2] && s.p[3]==s.p[4] && s.p[0]!=s.p[4])){//三带二 
			s.rank1 = 5, s.rank2 = s.p[2], s.rank3 = (s.p[0]==s.p[2])?s.p[4]:s.p[0], s.rank4 = 0;
		}
		
		else if((s.p[0]==s.p[1]&&s.p[1]==s.p[2])||(s.p[1]==s.p[2]&&s.p[2]==s.p[3])||(s.p[2]==s.p[3]&&s.p[3]==s.p[4])){//三连 
			s.rank1 = 4, s.rank2 = s.p[2];
			if(s.p[0]==s.p[1]&&s.p[1]==s.p[2]) s.rank3 = s.p[3]+s.p[4];
			if(s.p[1]==s.p[2]&&s.p[2]==s.p[3]) s.rank3 = s.p[0]+s.p[4];
			if(s.p[2]==s.p[3]&&s.p[3]==s.p[4]) s.rank3 = s.p[1]+s.p[0];
			s.rank4 = 0;
		}
		
		else if((s.p[0]==s.p[1]&&s.p[2]==s.p[3])||(s.p[0]==s.p[1]&&s.p[3]==s.p[4])||(s.p[1]==s.p[2]&&s.p[3]==s.p[4])){//两对 
			s.rank1 = 3;
			if(s.p[0]==s.p[1]&&s.p[2]==s.p[3]) s.rank2 = max(s.p[0], s.p[2]), s.rank3 = min(s.p[0], s.p[2]), s.rank4 = s.p[4];
			if(s.p[0]==s.p[1]&&s.p[3]==s.p[4]) s.rank2 = max(s.p[0], s.p[3]), s.rank3 = min(s.p[0], s.p[3]), s.rank4 = s.p[2];
			if(s.p[1]==s.p[2]&&s.p[3]==s.p[4]) s.rank2 = max(s.p[1], s.p[3]), s.rank3 = min(s.p[1], s.p[3]), s.rank4 = s.p[0];
		}
		
		else if(s.p[0]==s.p[1]||s.p[1]==s.p[2]||s.p[2]==s.p[3]||s.p[3]==s.p[4]){//对子 
			s.rank1 = 2;
			if(s.p[0]==s.p[1]) s.rank2 = s.p[0], s.rank3 = s.p[2]+s.p[3]+s.p[4];
			if(s.p[1]==s.p[2]) s.rank2 = s.p[1], s.rank3 = s.p[0]+s.p[3]+s.p[4];
			if(s.p[2]==s.p[3]) s.rank2 = s.p[2], s.rank3 = s.p[1]+s.p[0]+s.p[4];
			if(s.p[3]==s.p[4]) s.rank2 = s.p[3], s.rank3 = s.p[1]+s.p[0]+s.p[2];
			s.rank4 = 0;
		}
		else s.rank1 = 1, s.rank2 = s.p[0]+s.p[1]+s.p[2]+s.p[3]+s.p[4], s.rank3 = s.rank4 = 0;//单牌 
		return pin;
	}
	
	bool operator< (Player& s){
		if(rank1!=s.rank1) return rank1>s.rank1;
		if(rank2!=s.rank2) return rank2>s.rank2;
		if(rank3!=s.rank3) return rank3>s.rank3;
		if(rank4!=s.rank4) return rank4>s.rank4;
		return name < s.name;
	}
}a[N];

int main(){
	int m;
	cin >> m;
	for(int i = 0; i < m; i++) cin >> a[i];
	sort(a, a+m);
	for(int i = 0; i < m; i++) cout << a[i].name << endl;
	return 0;
}

说是大模拟,其实一百行都不到。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值