P1148 拱猪计分
网页链接
P1148 拱猪计分
题目描述
「拱猪」是一种很有趣的扑克牌游戏。即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。
- 我们分别以S , H , D , C \texttt S, \texttt H, \texttt D, \texttt CS,H,D,C来代表黑桃、红心、方块及梅花,并以数字1 11至13 1313来代表A , 2 , … , Q , K \texttt A, \texttt 2, \dots, \texttt Q, \texttt KA,2,…,Q,K等牌点,例如:H 1 H_1H1为红心A \texttt AA,S 13 S_{13}S13为黑桃K \texttt KK;
- 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有「猪」S 12 S_{12}S12,所有红心牌,「羊」D 11 D_{11}D11及「加倍」C 10 C_{10}C10等16 1616张牌,其它牌均弃置不计(也就是在下面的算分过程中不再考虑这些牌),若一位玩家未持有这16 1616张牌中任意一张,则以得零分计算;
- 若持有C 10 C_{10}C10牌的玩家只有该张牌而没有任何其它牌则得+ 50 +50+50分,否则将其它计分牌所得分数加倍计算;
- 若红心牌不在同一家,则H 1 H_1H1至H 13 H_{13}H13等13 1313张牌均以负分计,其数值依次为− 50 , − 2 , − 3 , − 4 , − 5 , − 6 , − 7 , − 8 , − 9 , − 10 , − 20 , − 30 , − 40 -50, -2, -3, -4, -5, -6, -7, -8, -9, -10, -20, -30, -40−50,−2,−3,−4,−5,−6,−7,−8,−9,−10,−20,−30,−40,且S 12 S_{12}S12与D 11 D_{11}D11的分值分别以− 100 -100−100及+ 100 +100+100分计算;
- 若红心牌H 1 H_1H1至H 13 H_{13}H13均在同一家,则有下列情形:
- 所有红心牌以+ 200 +200+200分计算。不是每一张牌都以+ 200 +200+200分计算,而是所有红心牌。
- 若S 12 , D 11 S_{12}, D_{11}S12,D11皆在吃下所有红心牌之一家,则此玩家得+ 500 +500+500分,这个分不与红心牌的+ 200 +200+200分叠加。否则这两张牌的分值以前文所述原则计算。
- C 10 C_{10}C10牌依旧以前文所述原则计算。
例一:若各玩家持有计分牌如下:
S12 H3 H5 H13D11 H8 H9C10 H1 H2 H4 H6 H7H10 H11 H12
则各家之得分依序为:− 148 , + 83 , − 138 -148, +83, -138−148,+83,−138及− 60 -60−60。
例二:若各玩家持有计分牌如下:
H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13S12 C10D11- 无
则各家之得分依序为:+ 200 , − 200 , + 100 +200, -200, +100+200,−200,+100及0 00。
输入格式
每个输入文件包含多组数据。
每组数据有四行,分别描述一个玩家。
每一行,第一个数为该玩家所持有计分牌总数,随后若干个符合题意的字符串描述其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。
相邻两组测试数据之间不包含空白行。若四家持牌数均为0 00,表示输入文件结束,不应处理这个测试数据。
输出格式
每一行表示一组数据对应的结果,依次输出各家所得分数,共4 44个整数,若非0 00则包含正负号;相邻两个整数之间以一个空格分开。
符号和数字间不带空格。每组数据的输出间不带空白行。
输入输出样例 #1
输入 #1
4 S12 H3 H5 H13 3 D11 H8 H9 6 C10 H1 H2 H4 H6 H7 3 H10 H11 H12 13 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 2 S12 C10 1 D11 0 0 0 0 0输出 #1
-148 +83 -138 -60 +200 -200 +100 0说明/提示
样例中两组数据为题面中的例子。
解题思路
本题核心是复杂规则模拟+卡牌状态统计,严格按照拱猪游戏计分规则计算分数。预处理红心牌、黑桃Q(猪)、方块J(羊)的基础分值,循环处理多组测试数据,直到四位玩家均无计分牌时终止。统计每位玩家持有的计分牌状态,优先判断是否集齐全部13张红心牌,触发特殊计分规则;未集齐则按基础负分/正分计算。单独处理梅花10(加倍)的规则:仅持该牌得50分,否则总分加倍。最后按照要求格式输出带正负号的分数,0直接输出,精准匹配题目所有计分细节。
总结
核心逻辑:完整模拟拱猪游戏的所有计分规则,区分红心全齐/未齐、加倍牌两种核心场景。
关键操作:统计玩家持有的特殊卡牌,按规则分步计算分数,严格遵循输出格式要求。
效率保障:线性遍历卡牌统计状态,常数级计算分数,无复杂运算,完美适配题目需求。
代码内容
#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vt;typedefpair<ll,ll>pll;constll N=1e4+10;constll p=1e9+7;constll INF=1e18;constll M=2e3+10;ll n,a[N][17];ll fp[17]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40,-100,100};intmain(){ll n,m;chars;while(1){ll ans=0,res=0;memset(a,0,sizeof(a));for(ll i=1;i<=4;i++){cin>>n;ans+=n;for(ll j=1;j<=n;j++){cin>>s>>m;if(s=='H')a[i][m]=1;if(s=='S')a[i][14]=1;if(s=='C')a[i][16]=1;if(s=='D')a[i][15]=1;}}if(ans==0)return0;for(ll i=1;i<=4;i++){ll ok=1;res=0;for(ll j=1;j<=13;j++){if(a[i][j]==0){ok=0;break;}}if(ok){if(a[i][14]&&a[i][15])res+=500;elseres+=200+((a[i][14])?1:0)*fp[14]+((a[i][15])?1:0)*fp[15];if(a[i][16])res*=2;if(res>0)printf("+%d ",res);elseprintf("%d ",res);}else{ok=1;for(ll j=1;j<=15;j++){if(a[i][j]){ok=0;break;}}if(ok==1){if(a[i][16])printf("+50 ");elseprintf("0 ");}else{for(ll j=1;j<=15;j++)res+=((a[i][j])?1:0)*fp[j];if(a[i][16])res*=2;if(res>0)printf("+%d ",res);elseprintf("%d ",res);}}}cout<<endl;}return0;}