最近,東東沉迷於打牌。所以他找到 hrz、zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則:所有撲克牌只按數字來算大小,忽略花色。
每張撲克牌的大小由乙個值表示。a, 2, 3, 4, 5, 6, 7, 8, 9, 10, j, q, k 分別指代 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。
每個玩家抽得 5 張撲克牌,組成一手牌!(每種撲克牌的張數是無限的,你不用擔心,東東家裡有無數副撲克牌)
理所當然地,一手牌是有不同型別,並且有大小之分的。大牌:這手牌不符合下面任乙個形成規則。如果 α 和 β 都是大牌,那麼定義它們的大小為組成這手牌的 5 張牌的大小總和。舉個栗子,現在東東的 「一手牌」(記為 α),瑞神的 「一手牌」(記為 β),要麼 α > β,要麼 α < β,要麼 α = β。
那麼這兩個 「一手牌」,如何進行比較大小呢?首先對於不同型別的一手牌,其值的大小即下面的標號;對於同型別的一手牌,根據組成這手牌的 5 張牌不同,其值不同。下面依次列舉了這手牌的形成規則:
對子:5 張牌中有 2 張牌的值相等。如果 α 和 β 都是對子,比較這個 「對子」 的大小,如果 α 和 β 的 「對子」 大小相等,那麼比較剩下 3 張牌的總和。
兩對:5 張牌中有兩個不同的對子。如果 α 和 β 都是兩對,先比較雙方較大的那個對子,如果相等,再比較雙方較小的那個對子,如果還相等,只能比較 5 張牌中的最後那張牌組不成對子的牌。
三個:5 張牌中有 3 張牌的值相等。如果 α 和 β 都是 「三個」,比較這個 「三個」 的大小,如果 α 和 β 的 「三個」 大小相等,那麼比較剩下 2 張牌的總和。
三帶二:5 張牌中有 3 張牌的值相等,另外 2 張牌值也相等。如果 α 和 β 都是 「三帶二」,先比較它們的 「三個」 的大小,如果相等,再比較 「對子」 的大小。
炸彈:5 張牌中有 4 張牌的值相等。如果 α 和 β 都是 「炸彈」,比較 「炸彈」 的大小,如果相等,比較剩下那張牌的大小。
順子:5 張牌中形成 x, x+1, x+2, x+3, x+4。如果 α 和 β 都是 「順子」,直接比較兩個順子的最大值。
龍順:5 張牌分別為 10、j、q、k、a。
作為乙個稱職的魔法師,東東得知了全場人手裡 5 張牌的情況。他現在要輸出乙個排行榜。排行榜按照選手們的 「一手牌」 大小進行排序,如果兩個選手的牌相等,那麼人名字典序小的排在前面。不料,此時一束宇宙射線掃過,為了躲避宇宙射線,東東慌亂中清空了他腦中的 cache。請你告訴東東,全場人的排名
輸入輸入包含多組資料。每組輸入開頭乙個整數 n (1 <= n <= 1e5),表明全場共多少人。
隨後是 n 行,每行乙個字串 s1 和 s2 (1 <= |s1|,|s2| <= 10), s1 是對應人的名字,s2 是他手裡的牌情況。
輸出對於每組測試資料,輸出 n 行,即這次全場人的排名。
樣例輸入3dongdong aaa109
zjm 678910
hrz 678910
樣例輸出設值為a、2、···、10、j、q、k的牌分別稱為第1、2、···、10、11、12、13種牌。hrzzjm
dongdong
設定乙個陣列times[14]:times[i] = k表示第i種牌出現了k次。
對於每個玩家,用times統計每種牌在五張牌**現的次數。
然後用5個向量type[5]統計出現了0~4次的牌分別有哪些。例如,若type[2] = ,則說明第2種牌、第3種牌各都出現了2次。
接著有如下幾種情況:
龍順:times[10] = 1 且 times[11] = 1 且 times[12] = 1 且 times[13] = 1 且 times[1] = 1。
順子:存在一i,使得times[i] = 1 且 times[i + 1] = 1 且 times[i + 2] = 1 且 times[i + 3] = 1 且 times[i + 4] = 1。
炸彈:type[4].size() != 0。
三帶二:type[3].size() != 0 且 type[2].size() != 0。
三個:type[3].size() != 0 且 type[2].size() = 0。
兩對:type[2].size() = 2。
對子:type[2].size() = 1。
大牌:type[2].size() = 0。
為了便於比較,對每個玩家的手牌進行打分,最後根據分值的高低進行排序。若有兩個玩家的手牌分值相同,那麼人名字典序小的排在前面。
而對手牌打分的規則為:
龍順:score = 8 * max。
順子:score = 7 * max + i + 4。
炸彈:score = 6 * max + type[4][0] * 100 + type[1][0]。
三帶二:score = 5 * max + type[3][0] * 100 + type[2][0]。
三個:score = 4 * max + type[3][0] * 100 + type[1][0] + type[1][1]。
兩對:score = 3 * max + max(type[2][0], type[2][1]) * 10000 + min(type[2][0], type[2][1]) * 100 + type[1][0]。
對子:score = 2 * max + type[2][0] * 100 + type[1][0] + type[1][1] + type[1][2]。
大牌:score = max + type[1][0] + type[1][1] + type[1][2] + type[1][3] + type[1][4]。
其中,max是乙個特別大的數,這樣就可以通過分值,即比較不同型別的手牌,又比較相同型別的手牌。
#include
#include
#include
#include
#include
#include
#include
#define max 1000000
using
namespace std;
struct player
;//每張牌出現的次數,times[0]不用
player
(string thename, string thecards)
:name
(thename)
,cards
(thecards)};
struct person
//排序
bool
operator
<
(const person& p)
const
if(name.
compare
(p.name)
<0)
return
false;}
};void
sortcard
(player& p)
else
if(card ==
'a') p.times[1]
++;else
if(card ==
'j') p.times[11]
++;else
if(card ==
'q') p.times[12]
++;else
if(card ==
'k') p.times[13]
++;ind++;}
}int
caluculate
(const player& p)
int n;
list persons;
void
init()
intmain()
//排序
persons.
sort()
;for
(list
::iterator it = persons.
begin()
; it != persons.
end(
); it++
) cout <<
(*it)
.name << endl;
}return0;
}
B 東東學打牌
最近,東東沉迷於打牌。所以他找到 hrz zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則 所有撲克牌只按數字來算大小,忽略花色。每張撲克牌的大小由乙個值表示。a,2,3,4,5,6,7,8,9,10,j,q,k 分別指代 1,2,3,4,5,6,7,8,9,10,11,12,13...
B 東東學打牌
最近,東東沉迷於打牌。所以他找到 hrz zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則 所有撲克牌只按數字來算大小,忽略花色。每張撲克牌的大小由乙個值表示。a,2,3,4,5,6,7,8,9,10,j,q,k 分別指代 1,2,3,4,5,6,7,8,9,10,11,12,13...
東東學打牌
最近,東東沉迷於打牌。所以他找到 hrz zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則 所有撲克牌只按數字來算大小,忽略花色。每張撲克牌的大小由乙個值表示。a,2,3,4,5,6,7,8,9,10,j,q,k 分別指代 1,2,3,4,5,6,7,8,9,10,11,12,13...