ICPCアジア瀋陽2019年のための予備コンテスト
テキサスホールデムポーカー
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 const int型MAXN = 1E6 + 10。 int型NUM [1000]; INTの排除(){ ためには、(INT I 15 =; I> = 5; I - ){ IF(NUM [I] && NUM [I-1] && NUM [I-2] && NUM [I-3] && NUM [1- 4])は、iを返します。 } -1を返します。 } 構造体ノード{ int型RK、NUM1、NUM2、NUM3。 文字列NA; ブール演算子<(CONSTノードA)のconst { IF(RK = a.rk!)戻りRK> a.rk。 もし(NUM1 = a.num1!)戻りNUM1> a.num1。 もし(!からnum2 = a.num2)リターンからnum2> a.num2。 (もし!NUM3 = a.num3)戻りNUM3> a.num3。 a.na <ナ返します。 } } [MAXN】b。 文字列s、NA; (; J <= 15、J ++のint J = 0)NUM [J] = 0; unordered_map <文字列、整数>ミリアンペア。 メインINT(){ //freopen("1.txt」、 "R"、STDIN)。 MA [ "A"] = 1。 MA [ "2"] = 2; MA [ "3"] = 3; MA [ "4"] = 4。 MA [ "10"] = 5。 MA [ "6"] = 6。 MA [ "7"] = 7。 MA [ "8"] = 8。 MA [ "9"] = 9。 MA [ "10"] = 10。 MA [ "J"] = 11。 MA [ "Q"] = 12。 MA [ "K"] = 13。 (CIN >> N){しばらく {ため(; iは<= N I ++はint型I = 1) CIN >> S NA。 B [i]は.na = NA。 文字列SS。 INT LEN = s.length()。 {(J ++; J <LEN INT J = 0)のための SS = ""; もし(!S [J] = '1')のSS = S [J]。 他{ SS = Sで[J]。 SS = SS + S [j + 1]。 J ++; } NUM [MA [SS]] ++; } IF(NUM [10] && NUM [11] && NUM [12] && NUM [13] && NUM [1]){ B [i]は.rk = 8。 B [i]は.num1 = bの[I] .num2 = bの[I] .num3 = 0。 持続する; } int型K =俊()。 IF(!K = - 1){ B [i]は.rk = 7。 B [i]は.num1 = K。 持続する; } INT F4 = 0、KK。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J] == 4){ KK = J。 F4 = 1。 ブレーク; } } もし(F4){ int型KKK。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J] == 1){ KKK = J。 ブレーク; } } 、B [i]は.rk = 6。 B [i]は.num1 = KK。 B [i]は.num2 = KKK。 B [i]は.num3 = 0。 持続する; } int型F3 = 0。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J] == 3){ KK = J。 F3 = 1。 ブレーク; } } もし(F3){ int型KKK、F2 = 0。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J] == 2){ KKK = J。 F2 = 1; ブレーク; } } {(F2)場合 、B [i]は.rk = 5。 B [i]は.num1 = KK。 B [i]は.num2 = KKK。 B [i]は.num3 = 0。 持続する; } int型の和= 0。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J] == 1){ 合計+ = J。 } } 、B [i]は.rk = 4。 B [i]は.num1 = KK。 B [i]は.num2 =和。 B [i]は.num3 = 0。 持続する; } KK = 0。 用(int型J = 0であり、j <= 15; J ++){ IF(NUM [J] == 2){ 株式会社++。 } } (KK == 2){もし INT MX = 0、MI = 10000、KKK。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J] == 2){ MX = MAX(MX、J)。 MI =分(MI、J)。 } IF(NUM [J] == 1){ KKK = J。 } } 、B [i]は.rk = 3。 B [i]は.num1 = MX。 B [i]は.num2 = MI。 B [i]は.num3 = KKK。 持続する; } IF(KK == 1){ int型KKK、和= 0。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J] == 2){ KKK = J。 }そうであれば(NUM [J])の合計+ = J。 } B [i]は.rk = 2。 B [i]は.num1 = KKK。 B [i]は.num2 =和。 B [i]は.num3 = 0。 持続する; } int型の和= 0。 (INT J = 0であり、j <= 15; J ++)用{ IF(NUM [J])の合計+ = J。 } B [i]は.rk = 1。 B [i]は.num1 =和。 } ソート(B + 1、B + N + 1)。 B [i]は.num2 = 0。 B [i]は.num3 = 0。 以下のために(INT i = 1; iが<= N; iは++){ COUT << B [i]は.na << ENDL。 } } 0を返します。 }