日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B - 东东学打牌(Week9.2作业)

發布時間:2024/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 B - 东东学打牌(Week9.2作业) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題面

最近,東東沉迷于打牌。所以他找到 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

ZJM

DongDong

題目思路

一道模擬題:通過定義結構體實現,judge函數給每一組牌打分,然后sort()排序,按照從大到小輸出

wa的原因總結:
1、沒有看到多組數據!!!我又犯這個錯誤了
2、出現了很智障的錯誤,在node結構體中排序當分數都相同時根據名字的字典序輸出,最后一行

return name.length()<p.name.length()

我打成了

return name.length() < name.length()

在這兒公開處刑,(還一直沒看到這個錯誤。

代碼實現

#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){//三個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; }

總結

以上是生活随笔為你收集整理的B - 东东学打牌(Week9.2作业)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。