B 東東學打牌

2021-10-05 09:53:40 字數 4555 閱讀 4592

最近,東東沉迷於打牌。所以他找到 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 行,即這次全場人的排名。

樣例輸入

3

dongdong aaa109

zjm 678910

hrz 678910

樣例輸出

hrz

zjmdongdong

本題比較簡單,因為每個人只有5張牌,同時這次牌的大小只與數字有關,與花色沒有關係,有了之前寫打牌題的經驗,可以很快寫出來。

主要流程為:輸入所有人名和牌——>處理每個人的牌——>所有人的牌排序——>輸出排序

那麼,現在來看每一步如何實現。

首先,輸入人名和牌,都用字串string類直接輸入即可。

然後,處理每個人的牌,這是最核心的一部分。先把每個人牌對應的字串,換成5個int型資料。

又因為下一步操作中想要將所有人的牌進行排序,那麼在這一步中,需要確定排序的標準,怎麼sort,並且在處理牌的同時把這個準則給標好,下一步直接sort即可。

因為要所有牌一起sort,所以所有牌都應該是乙個排序準則,但是牌的型別不同,每種牌的比較方法都不同,該如何統一?

解決方式:挑出所有型別的牌中比較標準最多的乙個,即兩對,可能需要比較較大的對子、較小的對子、剩下的一張單牌,有三個標準,再加上牌的型別的比較,人名字典序的比較,總共是五個比較標準,其他型別牌的比較都可以在五個標準之內完成。所以,過載player的<,依次按照五個標準比較。這五個標準在不同型別的牌中是不一樣的,但只需要在確定牌的型別之後,賦給每個標準相應的值即可。

最後直接對所有player進行sort排序,輸出對應排行榜即可。

#include

#include

using

namespace std;

int n=0;

//全場多少人

struct player

else

else

else

else}}

}}};

player pl[

100100];

void

classify

(player &p)

else

else

if(p.poker[i]

=='j')if

(p.poker[i]

=='q')if

(p.poker[i]

=='k')}

}}//轉換完成

sort

(po,po+5)

;//所有牌排序

//接下來判斷牌型

if(po[0]

==1&&po[1]

==10

&&po[2]

==11

&&po[3]

==12

&&po[4]

==13)if

(po[1]

==po[0]

+1&&po[2]

==po[1]

+1&&po[3]

==po[2]

+1&&po[4]

==po[3]

+1)if

((po[0]

==po[1]

&&po[1]

==po[2]

&&po[2]

==po[3]

)||(po[1]

==po[2]

&&po[2]

==po[3]

&&po[3]

==po[4]

))else

p.criti3=0;

return;}

if(((po[0]

==po[1]

&&po[1]

==po[2]

)&&(po[3]

==po[4]

))||(

(po[2]

==po[3]

&&po[3]

==po[4]

)&&(po[0]

==po[1]

)))else

p.criti3=0;

return;}

if((po[0]

==po[1]

&&po[1]

==po[2]

)||(po[1]

==po[2]

&&po[2]

==po[3]

)||(po[2]

==po[3]

&&po[3]

==po[4]

))else

else

}return;}

if((po[1]

==po[2]

&&po[3]

==po[4]

)||(po[0]

==po[1]

&&po[2]

==po[3]

)||(po[0]

==po[1]

&&po[3]

==po[4]

))else

}else

else

}else

else}}

return;}

if((po[0]

==po[1]

)||(po[1]

==po[2]

)||(po[2]

==po[3]

)||(po[3]

==po[4]

))if(po[1]

==po[2]

)if(po[2]

==po[3]

)if(po[3]

==po[4]

) p.criti3=0;

return;}

//cout<<"1\n";

p.type=

1; p.criti1=po[0]

+po[1]

+po[2]

+po[3]

+po[4]

; p.criti2=

0; p.criti3=0;

}int

main()

sort

(pl,pl+n)

;for

(int i=

0;ireturn0;

}

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...