news 2026/4/15 14:06:45

P1148 拱猪计分【洛谷算法习题】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P1148 拱猪计分【洛谷算法习题】

P1148 拱猪计分

网页链接

P1148 拱猪计分

题目描述

「拱猪」是一种很有趣的扑克牌游戏。即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。

  1. 我们分别以S , H , D , C \texttt S, \texttt H, \texttt D, \texttt CS,H,D,C来代表黑桃、红心、方块及梅花,并以数字1 1113 1313来代表A , 2 , … , Q , K \texttt A, \texttt 2, \dots, \texttt Q, \texttt KA,2,,Q,K等牌点,例如:H 1 H_1H1为红心A \texttt AAS 13 S_{13}S13为黑桃K \texttt KK
  2. 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有「猪」S 12 S_{12}S12,所有红心牌,「羊」D 11 D_{11}D11及「加倍」C 10 C_{10}C1016 1616张牌,其它牌均弃置不计(也就是在下面的算分过程中不再考虑这些牌),若一位玩家未持有这16 1616张牌中任意一张,则以得零分计算;
  3. 若持有C 10 C_{10}C10牌的玩家只有该张牌而没有任何其它牌则得+ 50 +50+50分,否则将其它计分牌所得分数加倍计算;
  4. 若红心牌不在同一家,则H 1 H_1H1H 13 H_{13}H1313 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, -4050,2,3,4,5,6,7,8,9,10,20,30,40,且S 12 S_{12}S12D 11 D_{11}D11的分值分别以− 100 -100100+ 100 +100+100分计算;
  5. 若红心牌H 1 H_1H1H 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牌依旧以前文所述原则计算。

例一:若各玩家持有计分牌如下:

  1. S12 H3 H5 H13
  2. D11 H8 H9
  3. C10 H1 H2 H4 H6 H7
  4. H10 H11 H12

则各家之得分依序为:− 148 , + 83 , − 138 -148, +83, -138148,+83,138− 60 -6060

例二:若各玩家持有计分牌如下:

  1. H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13
  2. S12 C10
  3. D11

则各家之得分依序为:+ 200 , − 200 , + 100 +200, -200, +100+200,200,+1000 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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 14:05:08

低查重AI教材生成秘籍大公开!专业工具助力高效编写优质教材!

编写教材的变革&#xff1a;AI 时代的新选择 编写教材离不开丰富的资料支持&#xff0c;但传统的资料整合方式已经无法满足现今的需求。以前&#xff0c;我们需要从各类渠道&#xff0c;例如课标文件、学术研究和教学案例中收集信息&#xff0c;这些资料分散在知网、教研平台等…

作者头像 李华
网站建设 2026/4/15 14:02:05

Navicat试用期重置终极指南:一键恢复14天免费试用

Navicat试用期重置终极指南&#xff1a;一键恢复14天免费试用 【免费下载链接】navicat-premium-reset-trial Reset macOS Navicat Premium 15/16/17 app remaining trial days 项目地址: https://gitcode.com/gh_mirrors/na/navicat-premium-reset-trial 作为一名数据库…

作者头像 李华
网站建设 2026/4/15 14:02:03

C语言的循环语句

说到C语言的循环语句 为什么会有循环 这是因为我们在处理一些算数问题或者其他问题的时候需要用到一系列的数字 而一个一个输十分繁琐 所以有了循环语句的使用。C语言循环语句总共分三种1.while 循环 2.do while 循环 3. for循环1.while循环while循环的结构和if分支的结构类似 …

作者头像 李华
网站建设 2026/4/15 14:01:11

【限时解禁】SITS2026闭门研讨精华:为什么92%的艺术生成失败源于模态权重失衡?3个实时校准公式立即生效

第一章&#xff1a;SITS2026分享&#xff1a;多模态艺术创作 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026大会上&#xff0c;多模态艺术创作成为跨学科融合的焦点议题。研究人员与艺术家共同展示了如何将文本、图像、音频与3D几何信号协同建模&#xff0c;生成具…

作者头像 李华