B - 东东学打牌(Week9.2作业)
題面
最近,東東沉迷于打牌。所以他找到 HRZ、ZJM 等人和他一起打牌。由于人數(shù)眾多,東東稍微修改了億下游戲規(guī)則:
所有撲克牌只按數(shù)字來算大小,忽略花色。
每張撲克牌的大小由一個(gè)值表示。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。
每個(gè)玩家抽得 5 張撲克牌,組成一手牌!(每種撲克牌的張數(shù)是無限的,你不用擔(dān)心,東東家里有無數(shù)副撲克牌)
理所當(dāng)然地,一手牌是有不同類型,并且有大小之分的。
舉個(gè)栗子,現(xiàn)在東東的 “一手牌”(記為 α),瑞神的 “一手牌”(記為 β),要么 α > β,要么 α < β,要么 α = β。
那么這兩個(gè) “一手牌”,如何進(jìn)行比較大小呢?首先對于不同類型的一手牌,其值的大小即下面的標(biāo)號;對于同類型的一手牌,根據(jù)組成這手牌的 5 張牌不同,其值不同。下面依次列舉了這手牌的形成規(guī)則:
大牌:這手牌不符合下面任一個(gè)形成規(guī)則。如果 α 和 β 都是大牌,那么定義它們的大小為組成這手牌的 5 張牌的大小總和。
對子:5 張牌中有 2 張牌的值相等。如果 α 和 β 都是對子,比較這個(gè) “對子” 的大小,如果 α 和 β 的 “對子” 大小相等,那么比較剩下 3 張牌的總和。
兩對:5 張牌中有兩個(gè)不同的對子。如果 α 和 β 都是兩對,先比較雙方較大的那個(gè)對子,如果相等,再比較雙方較小的那個(gè)對子,如果還相等,只能比較 5 張牌中的最后那張牌組不成對子的牌。
三個(gè):5 張牌中有 3 張牌的值相等。如果 α 和 β 都是 “三個(gè)”,比較這個(gè) “三個(gè)” 的大小,如果 α 和 β 的 “三個(gè)” 大小相等,那么比較剩下 2 張牌的總和。
三帶二:5 張牌中有 3 張牌的值相等,另外 2 張牌值也相等。如果 α 和 β 都是 “三帶二”,先比較它們的 “三個(gè)” 的大小,如果相等,再比較 “對子” 的大小。
炸彈:5 張牌中有 4 張牌的值相等。如果 α 和 β 都是 “炸彈”,比較 “炸彈” 的大小,如果相等,比較剩下那張牌的大小。
順子:5 張牌中形成 x, x+1, x+2, x+3, x+4。如果 α 和 β 都是 “順子”,直接比較兩個(gè)順子的最大值。
龍順:5 張牌分別為 10、J、Q、K、A。
作為一個(gè)稱職的魔法師,東東得知了全場人手里 5 張牌的情況。他現(xiàn)在要輸出一個(gè)排行榜。排行榜按照選手們的 “一手牌” 大小進(jìn)行排序,如果兩個(gè)選手的牌相等,那么人名字典序小的排在前面。
不料,此時(shí)一束宇宙射線掃過,為了躲避宇宙射線,東東慌亂中清空了他腦中的 Cache。請你告訴東東,全場人的排名
輸入
輸入包含多組數(shù)據(jù)。每組輸入開頭一個(gè)整數(shù) n (1 <= n <= 1e5),表明全場共多少人。
隨后是 n 行,每行一個(gè)字符串 s1 和 s2 (1 <= |s1|,|s2| <= 10), s1 是對應(yīng)人的名字,s2 是他手里的牌情況。
輸出
對于每組測試數(shù)據(jù),輸出 n 行,即這次全場人的排名。
樣例輸入3
DongDong AAA109
ZJM 678910
Hrz 678910
樣例輸出
Hrz
ZJM
DongDong
題目思路
一道模擬題:通過定義結(jié)構(gòu)體實(shí)現(xiàn),judge函數(shù)給每一組牌打分,然后sort()排序,按照從大到小輸出wa的原因總結(jié):
1、沒有看到多組數(shù)據(jù)!!!我又犯這個(gè)錯(cuò)誤了
2、出現(xiàn)了很智障的錯(cuò)誤,在node結(jié)構(gòu)體中排序當(dāng)分?jǐn)?shù)都相同時(shí)根據(jù)名字的字典序輸出,最后一行
我打成了
return name.length() < name.length()在這兒公開處刑,(還一直沒看到這個(gè)錯(cuò)誤。
代碼實(shí)現(xiàn)
#include<iostream> #include<cmath> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,sum,cnt; struct P{int first,second,three,sign;bool operator>(const P &p) const{if(sign!=p.sign) return sign>p.sign;if(first!=p.first) return first>p.first;if(second!=p.second)return second>p.second;return three>p.three;}bool operator!=(const P &p) const{if(sign==p.sign&&first==p.first&&second==p.second&&three==p.three)return false;else return true; } }; struct node {string name;int card[5];P score;bool operator<(const node &p)const{if(score!=p.score) return score>p.score;int l = min(name.length(),p.name.length());for(int i=0;i<l;i++){if((int)name[i]==(int)p.name[i]) continue;return (int)name[i]<(int)p.name[i];}return name.length()<p.name.length();} }a[100005]; P judge(int *p) {sort(p,p+5);sum=0;int temp=-1;cnt=0;int ink[13];memset(ink,0,sizeof(ink));for(int i=0;i<5;i++){ink[p[i]-1]++;sum+=p[i];if(p[i]==temp) continue;temp=p[i];cnt++;}P sc;int second1=-1,second2=-1,three=-1,four=-1;for(int i=0;i<13;i++){if(ink[i]==2){if(second1!=-1) second2=i+1;else second1=i+1;}else if(ink[i]==3) three=i+1;else if(ink[i]==4) four=i+1;}if(cnt==4){//對子 sc.sign=2;sc.first=second1;sc.second=sum-2*second1;sc.three=0;return sc;} sort(ink,ink+13, greater<int>());if(ink[0]==2&&ink[1]==2){//兩對 sc.sign=3;sc.first=max(second1,second2);sc.second=min(second1,second2);sc.three=sum-2*second1-2*second2;return sc;}if(ink[0]==3&&ink[1]==1){//三個(gè)sc.sign=4;sc.first=three;sc.second=sum-three*3;sc.three=0;return sc;} if(ink[0]==3&&ink[1]==2){//三帶二 sc.sign=5;sc.first=three;sc.second=second1;sc.three=0;return sc;}if(ink[0]==4&&ink[1]==1){//炸彈sc.sign=6;sc.first=four;sc.second=sum-4*four;sc.three=0;return sc;}bool flag=true;for(int i=1;i<5;i++){if(p[i]-p[i-1]!=1){flag=false;break;}} if(flag==true){//順子sc.sign=7;sc.first=p[4];sc.second=sc.three=0;return sc;}if(p[0]==1&&p[1]==10&&p[2]==11&&p[3]==12&&p[4]==13){//龍順 sc.sign=8;sc.first=13;sc.second=sc.three=0;return sc;}sc.sign=1;sc.first=sum;sc.second=sc.three=0;return sc; } void init(int x) {memset(a[x].card,0,sizeof(a[x].card));a[x].name.clear();a[x].score.sign=0;a[x].score.first=0;a[x].score.second=0;a[x].score.three=0; } int main() {//freopen("a.txt","r",stdin);while(cin>>n){for(int i=0;i<n;i++){init(i);cin>>a[i].name;string temp;cin>>temp;int num=0;for(int j=0;j<temp.length();j++){if(temp[j]=='1'){a[i].card[num++]=10;j++; }else if(temp[j]=='A') a[i].card[num++]=1;else if(temp[j]=='J') a[i].card[num++]=11;else if(temp[j]=='Q') a[i].card[num++]=12;else if(temp[j]=='K') a[i].card[num++]=13;else a[i].card[num++]=(int)temp[j]-48;}a[i].score=judge(a[i].card);}sort(a,a+n);for(int i=0;i<n;i++){cout<<a[i].name<<endl;} }return 0; }總結(jié)
以上是生活随笔為你收集整理的B - 东东学打牌(Week9.2作业)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 感冒药盒上请看清这6个字,一定要注意!
- 下一篇: 王志东经理