7w523

题目描述

你玩过7王523吗?

这个扑克牌游戏可以 2~5 个人玩,最开始的时候,每人 555 张牌,庄家 666 张牌。庄家首先出牌,然后轮流出牌或不出牌。

第一个出牌的人可以打出任意牌,后面的人必须比前面的牌大才能出牌,且牌型必须要和前面人出牌的牌型一致或大于前面人的牌型。

牌的大小关系是 7>大王>小王>5>2>3>A>K>Q>J>10>9>8>6>4.不区分花色。

牌型有:对子(两张牌点数一样),炸弹(三张牌一样),氢弹(四张牌一样)

牌型的大小关系是:氢弹>炸弹>对子、单牌

另外还有一种特殊的出牌规则,如果有人出单牌,某人手上有一样点数的对子,则有对子的人可以忽略出牌顺序直接“碰”。在“碰”后,后面只有炸弹或氢弹可以出。(比如甲出单牌,后面只要有人有碰,一定是先满足碰)

当某个人打出的牌没人要时,本轮出牌结束,最后一个出牌的人取得本轮胜利,本轮出的牌就是胜利的人的积分,111 张牌记 111 分。再由胜利的人开始在剩余牌中按顺序拿几张牌和手上的牌凑够五张,接下来按顺序另外的人也从剩余牌中按顺序拿够 555 张。 如果牌库中牌的数量不够某个人拿够555张, 则停止拿牌环节。 如果发牌环节结束后某个玩家没有牌, 则整个游戏结束, 同时每个玩家的得分加上其手牌数量。

例如:

甲:2 4 4 6 K

乙:3 8 8 J 10

丙:K K 4 A A

剩余牌:7 7 2

假设出牌顺序是甲、乙、丙;

第一轮:甲先出 666,则乙可以出 JJJ、101010 或 333;丙如果不要,则甲可以出 222。这个时候没有人有牌能够大过 222,该轮出牌结束,甲获得胜利可以得到 333 个积分。接下来甲可以从剩余牌中获得 222 个 777,而乙可以获得 222。丙没有出牌就不能拿。

第二轮:甲出 KKK,这个时候丙可以跳过乙优先进行“碰”,由于其他人没有炸弹,所以丙获得该轮胜利,得到 333 个积分。

为了简化问题,我们不考虑获胜的策略。也就是说轮到某人出牌,如果他手上的牌有大于前面人出的牌,则他就打出刚好大于前面的牌(有出必出),有“碰”必“碰”。 比如第一个人出 QQQ,第二个人牌是 K333K333K333,第三个人牌是 QQJQQJQQJ,则第三个人会先碰出来。因为对于第二个人来说他优先选择出 KKK,所以第三个人先碰。

每一轮第一个出牌的人,优先出手中最小的对子(为了尽可能让别人要不起, 7 除外),没有对子就出最小的单牌,没有单牌出对 7,没有对 7 出最小的炸弹,没有炸弹出氢弹。接下来轮流出牌,出的牌型必须和前面一至或大于前面的牌型,对子、炸弹、氢弹不能拆开出,出牌的原则的刚好大于前面的牌,如果没有大过前面的牌就 PASSPASSPASS,由后面一个人出牌。如果一个人出的牌其他人都 PASSPASSPASS,则本轮结束,最后一个出牌的为胜利者。

**注:**大王与小王不在一起算单牌,大王和小王在一起算炸弹(不能拆开),且是仅次于 777777777 的最大炸弹。任何氢弹都大于任何炸弹, 包括王炸。若牌库无牌, 且某玩家出牌后刚好打完, 这一回合仍然需要进行完才算游戏结束。

开始的时候,第一个人自动作为庄家先拿前面的 666 张牌,接下来玩家依次拿 555 张(若不够则停止拿牌环节)。当没有剩余的牌且发牌环节某个玩家手上没有牌,游戏结束,其他玩家手中的没有打出去的牌自动算为该玩家的积分。

输入输出格式
输入格式

一共 222 行;

第一行是一个整数 MMM 表示玩家人数,第二行是一个字符串表示初始牌的顺序,其中大王用GGG 表示,小王用 FFF 表示,10 用 XXX 表示。

输出格式

MMM 行,每行是一个整数,表示第 iii 个玩家最后获得的积分。

输入输出样例
输入样例#1:
3
25G36Q3885XKK4AA77A
输出样例#1:
13
2
4

样例解释

第一轮:第一个人出 6,然后第二个人出 X,第三个人不要,第一个人出 Q,第二个人出 3,第三个人不要,第一个人出 2,第二个人出 5、三个人不要,第一个人出 G,第二三个人不要,第一轮结束。第一个人获得积分 7,然后获得 77A 三张牌

第二轮:第一个人出 A, 第三个人有碰优先由第三个人碰,第三个人碰后,没有人有炸弹,该轮第三个人胜利。第三个人获得积分 3

第三轮:第三个人出对 K,第一个人出对 7,第一个人取得本轮胜利获得积分 4 第四轮:第一个人出 3,第二个人、第三个人 pass,第一个人取得胜利获得积分 1 第五轮:第一个人出 5,第一个人取得胜利获得积分 1。游戏结束。最后得分:

第一个人:13

第二个人:2

第三个人:4

【数据特点】

对于 100%数据,保证开始每个人至少有一张牌。一副牌中最多只有一张大王和小王,每个点数的牌张数不超过 4,所有字母均为大写,只有 J,Q,K,A,G,X,F,9,8,7,6,5,4,3,2 这些牌。

测试点 玩家人数 扑克牌总数 特殊情况
1 2 ≤11\le 11≤11 没有碰、炸弹、氢弹
2 2 ≤54\le 54≤54 没有炸弹、氢弹
3 3 ≤16\le 16≤16
4 3 ≤54\le 54≤54 没有碰
5 3 ≤54\le 54≤54 没有炸弹、氢弹
6 4 ≤21\le 21≤21 没有碰
7 4 ≤21\le 21≤21 没有王炸
8 4 ≤54\le 54≤54 没有碰、炸弹、氢弹
9 4 ≤54\le 54≤54 没有炸弹、氢弹
10 4 ≤54\le 54≤54
题解

辣鸡大模拟,不过我大概是全网最短的代码:

代码
#include<cstdio>
#include<cstring>
#define put(pos,typ,siz) my[pos][siz]=0,cot[pos]-=typ,flag=1,last=(sd){pos,typ,siz}
const int N=15;
struct sd{int pos,typ,siz;}last;
int val[256],my[6][16],cot[6],sta[55],scr[6],top,n,flag;
char ch[55];
int kind[]={0,'4','6','8','9','X','J','Q','K','A','3','2','5','F','G','7'};
void getcard(int pos,int siz)
{for(;cot[pos]<siz&&top;++my[pos][sta[top--]],++cot[pos]);if(my[pos][13]&&my[pos][14])my[pos][13]=0,my[pos][14]=3;
}
void putcard(int pos)
{int typ=last.typ,siz=last.siz;if(!typ){for(int i=1;i<N;++i)if(my[pos][i]==2){put(pos,2,i);return;}for(int i=1;i<=N;++i)if(my[pos][i]==1){put(pos,1,i);return;}if(my[pos][N]==2){put(pos,2,N);return;}for(int i=1;i<=N;++i)if(my[pos][i]==3){if(i==14)cot[pos]+=1;put(pos,3,i);return;}for(int i=1;i<=N;++i)if(my[pos][i]==4){put(pos,4,i);return;}}for(int i=1;i<=N;++i)if(my[pos][i]==typ&&i>siz){if(i==14&&typ==3)cot[pos]+=1;put(pos,typ,i);return;}for(int j=(typ==1?3:typ+1);j<=4;++j)for(int i=1;i<=N;++i)if(my[pos][i]==j){if(i==14&&j==3)cot[pos]+=1;put(pos,j,i);return;}flag=0;
}
bool peng(){for(int i=0;i<n;++i)if(last.typ==1&&my[i][last.siz]==2)return put(i,2,last.siz),last=(sd){i,3,-1},1;return 0;}
void game()
{for(int i=1;i<=N;++i)val[kind[i]]=i;for(int i=strlen(ch+1);i;--i)sta[++top]=val[ch[i]];getcard(0,6);for(int i=1;i<n;++i)getcard(i,5);for(int pos,cnt;;last.typ=0,scr[last.pos]+=cnt){for(int i=0;i<n;++i)getcard((last.pos+i)%n,5);if(!top)for(int i=0;i<n;++i)if(!cot[i])return;putcard(last.pos),cnt=last.typ;if(last.typ==3&&last.siz==14)cnt-=1;if(peng())cnt+=2,pos=last.pos;for(pos=(last.pos+1)%n;pos!=last.pos;pos=(pos+1)%n,flag=0){putcard(pos);if(flag){cnt+=last.typ;if(last.typ==3&&last.siz==14)cnt-=1;}if(peng())cnt+=2,pos=last.pos;}}
}
void in(){scanf("%d%s",&n,ch+1);}
void ac(){game();for(int i=0;i<n;++i)printf("%d\n",scr[i]+cot[i]);}
int main(){in(),ac();}

[2018.11.03 T4] 7w523相关推荐

  1. 2018.11.03 NOIP模拟 地球发动机(线性dp)

    传送门 考试5分钟写完. 如果没这题今天多半爆零了(汗 直接二分出合法的转移范围. 然后用后面的状态更新前面的就可以了. 代码

  2. Unity3d 在 twitter 转载(周报) 2018.11.10

    选自过去1~2周的内容: https://twitter.com/unity3d 日文: Unity WebGL启动过程 Unity减少内存使用方法(主要是WebGL) 2) Shader: 决定扩展 ...

  3. QIIME 2用户文档. 18使用q2-vsearch聚类OTUs(2018.11)

    文章目录 前情提要 使用`q2-vsearch`聚类序列为OTUs 下载数据 序列去冗余 特征[频率]和特征数据[序列]的聚类 无参聚类 有参聚类 半有参聚类 Reference 译者简介 猜你喜欢 ...

  4. QIIME 2用户文档. 17序列双端合并read-joining(2018.11)

    文章目录 前情提要 序列双端合并的另一种方法`read-joining` 数据下载 序列合并 查看合并序列的数据质量和摘要 序列质控 Deblur 查看Deblur特征表 导入双端合并的序列 导入序列 ...

  5. QIIME 2用户文档. 16鉴定和过滤嵌合体序列q2-vsearch(2018.11)

    文章目录 前情提要 鉴定和过滤嵌合体序列`q2-vsearch` 数据下载 无参嵌合体鉴定 可视化统计结果 过滤特征表和序列 过滤嵌合体和可疑序列 过滤嵌合但保留可疑序列 Reference 译者简介 ...

  6. QIIME 2用户文档. 15进行纵向和成对样本比较q2-longitudinal(2018.11)

    文章目录 前情提要 进行纵向和成对样本比较`q2-longitudinal` 成对差异比较 线性混合效应模型 波动性分析 跟踪变化率的第一个差异 从静态时间点跟踪变化率 非参数微生物相关性试验(NMI ...

  7. QIIME 2用户文档. 14机器学习预测样品元数据分类和回归q2-sample-classifier(2018.11)

    文章目录 前情提要 预测样本元数据`q2-sample-classifier` 预测样本分类 预测样本连续型元数据 嵌套交叉验证为所有样本提供预测 最佳实践:不应该使用`q2-sample-class ...

  8. QIIME 2用户文档. 13数据评估和质控Evaluating and controlling(2018.11)

    文章目录 前情提要 数据评估和质控`q2-quality-control` 下载数据 基于比对过滤序列 质量评估已知组成的样品 评估序列质量 Reference 译者简介 猜你喜欢 写在后面 前情提要 ...

  9. QIIME 2用户文档. 12训练特征分类器Training feature classifiers(2018.11)

    文章目录 前情提要 训练特征分类器 下载并导入参考序列 提取参考序列 训练分类集 测试分类集 分类真菌ITS序列 Reference 译者简介 猜你喜欢 写在后面 前情提要 QIIME 2可重复.交互 ...

  10. QIIME 2用户文档. 11数据筛选Filtering data(2018.11)

    文章目录 前情提要 QIIME 2用户文档. 11数据筛选 下载实验相关数据 过滤特征表 按数据量过滤 偶然因素的过滤 基于索引的过滤 基于元数据的筛选 基于物种过滤表和序列 过滤序列 过滤距离矩阵 ...

最新文章

  1. python私有属性怎么定义_Python中私有属性的定义方式
  2. android 解决ListView点击与滑动事件冲突
  3. centos 5.4 x64 安装nagios 3.2.3
  4. OpenCV形态学变换函数morphologyEx()顶帽运算的使用
  5. windows 编程随笔——输出文本WM_PAINT消息|有效矩形和无效矩形
  6. 强化学习组队学习task04—— DQN 算法及 Actor-Critic 算法
  7. (转)Docker 基础 : Dockerfile
  8. matlab的save函数用法
  9. MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error
  10. python运行cmd命令和opencv搭建_Python环境搭建之OpenCV
  11. 西门子tcpip通讯实例_西门子200SMART与视觉软件TCPIP通讯
  12. visual studio 2019 代码历史记录 本地版本控制 AnkhSvn Local History 教程
  13. 51单片机基础实验例程
  14. C语言开发windows桌面程序,演练:创建传统的 Windows 桌面应用程序 (c + +)
  15. 下载文件夹压缩为zip格式时打开报不可预料的压缩文件末端
  16. AE IFeatureClass导出SHP文件
  17. Rabbitmq安装过程(使用docker)
  18. Lua语言历险记1.1——最简单最便捷的安装编译环境方式
  19. 如何提高网站关键词排名和增加收录量
  20. 人生规划:事业成功的导航仪

热门文章

  1. 【POJ 3279】【开关问题】Fliptile【暑期 No.5】
  2. mysql高性能sql引擎剖析_Oracle+高性能SQL引擎剖析:SQL优化与调优机制详解-笔记之执行计划(一)...
  3. 345.反转字符串中的元音字符(力扣leetcode) 博主可答疑该问题
  4. python程序化设计正则表达式语法_基于python的正则表达式学习笔记
  5. Linux下查看CPU型号,内存大小,硬盘空间,进程等的命令(详解)
  6. 一起写框架-控制反转(Ioc)概述(二)
  7. Python之 多重循环
  8. P1082||T1200 同余方程 codevs|| 洛谷
  9. hihoCoder 1369 网络流一·Ford-Fulkerson算法 (网络流学习#1 记录)
  10. 解决Linux下SSH等终端乱码问题