社区讨论

德州扑克TLE求优化

AT_icpc2012autumn_bTexas hold 'em参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m60kczml
此快照首次捕获于
2025/01/17 17:35
去年
此快照最后确认于
2025/11/04 11:26
4 个月前
查看原帖
CPP
//1.同花顺:五张连续的牌,并且花色相同。
//2.四条:四张相同点数的牌。
//3.满堂红:三张相同点数的牌,加上一对其他点数的牌。
//4.同花:五张花色相同但不连续的牌。
//5.顺子:五张连续的牌,但是花色不同。
//6.三条: 只要有三张相同点数的牌。
//7.两对:两张相同点数的牌,和另外两张相同点数的牌。
//8.一对: 只是一对相同点数的牌。
//9.高牌:任何其他牌。


#pragma GCC optimize(2,3,"Ofast","inline")

#include <bits/stdc++.h>

#define pb(x) push_back(x)

using namespace std;

const string DS="23456789TJQKA";
const string HS="SHDC";

struct pkp{
	char hs,ds;
	bool operator > (const pkp& x)const{
		return DS.find(ds)>DS.find(x.ds);
	}
	void operator = (const string& s){
		hs=s[0],ds=s[1];
	}
	void operator = (const pkp& x){
		hs=x.hs,ds=x.ds;
	}
	bool operator == (const pkp& x){
		if(x.hs==hs && x.ds==ds){
			return true;
		}
		return false;
	}
}i1,i2,u1,u2,g1,g2,g3,g4,g5;

struct zh{
	pkp p[5],q[5];
	int px;
	void inline mp(pkp a,pkp b,pkp c,pkp d,pkp e,int f){
		p[0]=a,p[1]=b,p[2]=c,p[3]=d,p[4]=e,px=f;
	}
	void operator = (const zh& x){
		for(int i=0;i<5;i++) p[i]=x.p[i];
		px=x.px;
	}
	void inline upd(){
		int x[5]={0,1,2,3,4};
		do{
			int a=x[0],b=x[1],c=x[2],d=x[3],e=x[4];
			if(p[a].hs==p[b].hs && p[b].hs==p[c].hs && p[c].hs==p[d].hs && p[d].hs==p[e].hs && DS.find(p[a].ds)-DS.find(p[b].ds)==1 && DS.find(p[b].ds)-DS.find(p[c].ds)==1 && DS.find(p[c].ds)-DS.find(p[d].ds)==1 && DS.find(p[d].ds)-DS.find(p[e].ds)==1 && px>1){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=1;
			}
			if(p[a].hs==p[b].hs && p[b].hs==p[c].hs && p[c].hs==p[d].hs && p[d].hs==p[e].hs && p[a].ds=='5' && p[b].ds=='4' && p[c].ds=='3' && p[d].ds=='2' && p[e].ds=='A' && px>1){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=1;
			}
			if(p[a].ds==p[b].ds && p[b].ds==p[c].ds && p[c].ds==p[d].ds && px>2){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=2;
			}
			if(p[a].ds==p[b].ds && p[b].ds==p[c].ds && p[d].ds==p[e].ds && px>3){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=3;
			}
			if(p[a].hs==p[b].hs && p[b].hs==p[c].hs && p[c].hs==p[d].hs && p[d].hs==p[e].hs && DS.find(p[a].ds)>=DS.find(p[b].ds) && DS.find(p[b].ds)>=DS.find(p[c].ds) && DS.find(p[c].ds)>=DS.find(p[d].ds) && DS.find(p[d].ds)>=DS.find(p[e].ds) && px>4){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=4;
			}
			if(DS.find(p[a].ds)-DS.find(p[b].ds)==1 && DS.find(p[b].ds)-DS.find(p[c].ds)==1 && DS.find(p[c].ds)-DS.find(p[d].ds)==1 && DS.find(p[d].ds)-DS.find(p[e].ds)==1 && px>5){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=5;
			}
			if(p[a].ds=='5' && p[b].ds=='4' && p[c].ds=='3' && p[d].ds=='2' && p[e].ds=='A' && px>5){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=5;
			}
			if(p[a].ds==p[b].ds && p[b].ds==p[c].ds && DS.find(p[d].ds)>=DS.find(p[e].ds) && px>6){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=6;
			}
			if(p[a].ds==p[b].ds && p[c].ds==p[d].ds && DS.find(p[a].ds)>=DS.find(p[c].ds) && px>7){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=7;
			}
			if(p[a].ds==p[b].ds && DS.find(p[c].ds)>=DS.find(p[d].ds) && DS.find(p[d].ds)>=DS.find(p[e].ds) && px>8){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=8;
			}
			if(DS.find(p[a].ds)>=DS.find(p[b].ds) && DS.find(p[b].ds)>=DS.find(p[c].ds) && DS.find(p[c].ds)>=DS.find(p[d].ds) && DS.find(p[d].ds)>=DS.find(p[e].ds) && px>9){
				q[0]=p[a],q[1]=p[b],q[2]=p[c],q[3]=p[d],q[4]=p[e],px=9;
			}
		}while(next_permutation(x,x+5));
	}
};

vector<zh> v1,v2; 

signed main(){
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);

	cin.tie(0),cout.tie(0);
	ios::sync_with_stdio(false);

	string s;
	while(cin >> s){
		if(s=="#"){
			return 0;
		}
		i1=s;
		cin >> s;
		i2=s;
		cin >> s;
		u1=s;
		cin >> s;
		u2=s;
		cin >> s;
		g1=s;
		cin >> s;
		g2=s;
		cin >> s;
		g3=s;
		int tot=0,cnt=0;
		for(char h1:HS){
			for(char d1:DS){
				for(char h2:HS){
					for(char d2:DS){
						string x="";
						x+=h1;
						x+=d1;
						g4=x;
						x="";
						x+=h2;
						x+=d2;
						g5=x;
						if(g4==i1 || g4==i2 || g4==u1 || g4==u2 || g4==g1 || g4==g2 || g4==g3 || g5==i1 || g5==i2 || g5==u1 || g5==u2 || g5==g1 || g5==g2 || g5==g3 || g5==g4){
							continue;
						}
						tot++;
						v1.clear(),v2.clear();
						zh y;
						y.mp(g1,g2,g3,g4,g5,10ll);
						v1.pb(y);
						y.mp(i1,i2,g1,g2,g3,10ll);
						v1.pb(y);
						y.mp(i1,i2,g1,g2,g4,10ll);
						v1.pb(y);
						y.mp(i1,i2,g1,g2,g5,10ll);
						v1.pb(y);
						y.mp(i1,i2,g1,g3,g4,10ll);
						v1.pb(y);
						y.mp(i1,i2,g1,g3,g5,10ll);
						v1.pb(y);
						y.mp(i1,i2,g1,g4,g5,10ll);
						v1.pb(y);
						y.mp(i1,i2,g2,g3,g4,10ll);
						v1.pb(y);
						y.mp(i1,i2,g2,g3,g5,10ll);
						v1.pb(y);
						y.mp(i1,i2,g2,g4,g5,10ll);
						v1.pb(y);
						y.mp(i1,i2,g3,g4,g5,10ll);
						v1.pb(y);
						y.mp(i1,g1,g2,g3,g4,10ll);
						v1.pb(y);
						y.mp(i1,g1,g2,g3,g5,10ll);
						v1.pb(y);
						y.mp(i1,g1,g2,g4,g5,10ll);
						v1.pb(y);
						y.mp(i1,g1,g3,g4,g5,10ll);
						v1.pb(y);
						y.mp(i1,g2,g3,g4,g5,10ll);
						v1.pb(y);
						y.mp(i2,g1,g2,g3,g4,10ll);
						v1.pb(y);
						y.mp(i2,g1,g2,g3,g5,10ll);
						v1.pb(y);
						y.mp(i2,g1,g2,g4,g5,10ll);
						v1.pb(y);
						y.mp(i2,g1,g3,g4,g5,10ll);
						v1.pb(y);
						y.mp(i2,g2,g3,g4,g5,10ll);
						v1.pb(y);
						y.mp(g1,g2,g3,g4,g5,10ll);
						v2.pb(y);
						y.mp(u1,u2,g1,g2,g3,10ll);
						v2.pb(y);
						y.mp(u1,u2,g1,g2,g4,10ll);
						v2.pb(y);
						y.mp(u1,u2,g1,g2,g5,10ll);
						v2.pb(y);
						y.mp(u1,u2,g1,g3,g4,10ll);
						v2.pb(y);
						y.mp(u1,u2,g1,g3,g5,10ll);
						v2.pb(y);
						y.mp(u1,u2,g1,g4,g5,10ll);
						v2.pb(y);
						y.mp(u1,u2,g2,g3,g4,10ll);
						v2.pb(y);
						y.mp(u1,u2,g2,g3,g5,10ll);
						v2.pb(y);
						y.mp(u1,u2,g2,g4,g5,10ll);
						v2.pb(y);
						y.mp(u1,u2,g3,g4,g5,10ll);
						v2.pb(y);
						y.mp(u1,g1,g2,g3,g4,10ll);
						v2.pb(y);
						y.mp(u1,g1,g2,g3,g5,10ll);
						v2.pb(y);
						y.mp(u1,g1,g2,g4,g5,10ll);
						v2.pb(y);
						y.mp(u1,g1,g3,g4,g5,10ll);
						v2.pb(y);
						y.mp(u1,g2,g3,g4,g5,10ll);
						v2.pb(y);
						y.mp(u2,g1,g2,g3,g4,10ll);
						v2.pb(y);
						y.mp(u2,g1,g2,g3,g5,10ll);
						v2.pb(y);
						y.mp(u2,g1,g2,g4,g5,10ll);
						v2.pb(y);
						y.mp(u2,g1,g3,g4,g5,10ll);
						v2.pb(y);
						y.mp(u2,g2,g3,g4,g5,10ll);
						v2.pb(y);
						for(zh& z:v1){
							z.upd();
						}
						for(zh& z:v2){
							z.upd();
						}
						bool flag=false;
						for(zh z1:v1){
							bool ok=true;
							for(zh z2:v2){
								if(z1.px<z2.px){
									continue;
								}
								if(z1.px>z2.px){
									ok=false;
									break;
								}
								ok=false;
								for(int i=0;i<5;i++){	
									if(DS.find(z1.q[i].ds)>DS.find(z2.q[i].ds)){
										ok=true;
										break;
									}else if(DS.find(z1.q[i].ds)<DS.find(z2.q[i].ds)){
										break;
									}
								}
							}
							if(ok) flag=true;
						}
						if(flag) cnt++;
					}
				}
			}
		}
		cout << fixed << setprecision(20) << 1.0*cnt/tot << endl;
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...