[2018.11.03 T4] 7w523
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&⊤++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相关推荐
- 2018.11.03 NOIP模拟 地球发动机(线性dp)
传送门 考试5分钟写完. 如果没这题今天多半爆零了(汗 直接二分出合法的转移范围. 然后用后面的状态更新前面的就可以了. 代码
- Unity3d 在 twitter 转载(周报) 2018.11.10
选自过去1~2周的内容: https://twitter.com/unity3d 日文: Unity WebGL启动过程 Unity减少内存使用方法(主要是WebGL) 2) Shader: 决定扩展 ...
- QIIME 2用户文档. 18使用q2-vsearch聚类OTUs(2018.11)
文章目录 前情提要 使用`q2-vsearch`聚类序列为OTUs 下载数据 序列去冗余 特征[频率]和特征数据[序列]的聚类 无参聚类 有参聚类 半有参聚类 Reference 译者简介 猜你喜欢 ...
- QIIME 2用户文档. 17序列双端合并read-joining(2018.11)
文章目录 前情提要 序列双端合并的另一种方法`read-joining` 数据下载 序列合并 查看合并序列的数据质量和摘要 序列质控 Deblur 查看Deblur特征表 导入双端合并的序列 导入序列 ...
- QIIME 2用户文档. 16鉴定和过滤嵌合体序列q2-vsearch(2018.11)
文章目录 前情提要 鉴定和过滤嵌合体序列`q2-vsearch` 数据下载 无参嵌合体鉴定 可视化统计结果 过滤特征表和序列 过滤嵌合体和可疑序列 过滤嵌合但保留可疑序列 Reference 译者简介 ...
- QIIME 2用户文档. 15进行纵向和成对样本比较q2-longitudinal(2018.11)
文章目录 前情提要 进行纵向和成对样本比较`q2-longitudinal` 成对差异比较 线性混合效应模型 波动性分析 跟踪变化率的第一个差异 从静态时间点跟踪变化率 非参数微生物相关性试验(NMI ...
- QIIME 2用户文档. 14机器学习预测样品元数据分类和回归q2-sample-classifier(2018.11)
文章目录 前情提要 预测样本元数据`q2-sample-classifier` 预测样本分类 预测样本连续型元数据 嵌套交叉验证为所有样本提供预测 最佳实践:不应该使用`q2-sample-class ...
- QIIME 2用户文档. 13数据评估和质控Evaluating and controlling(2018.11)
文章目录 前情提要 数据评估和质控`q2-quality-control` 下载数据 基于比对过滤序列 质量评估已知组成的样品 评估序列质量 Reference 译者简介 猜你喜欢 写在后面 前情提要 ...
- QIIME 2用户文档. 12训练特征分类器Training feature classifiers(2018.11)
文章目录 前情提要 训练特征分类器 下载并导入参考序列 提取参考序列 训练分类集 测试分类集 分类真菌ITS序列 Reference 译者简介 猜你喜欢 写在后面 前情提要 QIIME 2可重复.交互 ...
- QIIME 2用户文档. 11数据筛选Filtering data(2018.11)
文章目录 前情提要 QIIME 2用户文档. 11数据筛选 下载实验相关数据 过滤特征表 按数据量过滤 偶然因素的过滤 基于索引的过滤 基于元数据的筛选 基于物种过滤表和序列 过滤序列 过滤距离矩阵 ...
最新文章
- python私有属性怎么定义_Python中私有属性的定义方式
- android 解决ListView点击与滑动事件冲突
- centos 5.4 x64 安装nagios 3.2.3
- OpenCV形态学变换函数morphologyEx()顶帽运算的使用
- windows 编程随笔——输出文本WM_PAINT消息|有效矩形和无效矩形
- 强化学习组队学习task04—— DQN 算法及 Actor-Critic 算法
- (转)Docker 基础 : Dockerfile
- matlab的save函数用法
- MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error
- python运行cmd命令和opencv搭建_Python环境搭建之OpenCV
- 西门子tcpip通讯实例_西门子200SMART与视觉软件TCPIP通讯
- visual studio 2019 代码历史记录 本地版本控制 AnkhSvn Local History 教程
- 51单片机基础实验例程
- C语言开发windows桌面程序,演练:创建传统的 Windows 桌面应用程序 (c + +)
- 下载文件夹压缩为zip格式时打开报不可预料的压缩文件末端
- AE IFeatureClass导出SHP文件
- Rabbitmq安装过程(使用docker)
- Lua语言历险记1.1——最简单最便捷的安装编译环境方式
- 如何提高网站关键词排名和增加收录量
- 人生规划:事业成功的导航仪
热门文章
- 【POJ 3279】【开关问题】Fliptile【暑期 No.5】
- mysql高性能sql引擎剖析_Oracle+高性能SQL引擎剖析:SQL优化与调优机制详解-笔记之执行计划(一)...
- 345.反转字符串中的元音字符(力扣leetcode) 博主可答疑该问题
- python程序化设计正则表达式语法_基于python的正则表达式学习笔记
- Linux下查看CPU型号,内存大小,硬盘空间,进程等的命令(详解)
- 一起写框架-控制反转(Ioc)概述(二)
- Python之 多重循环
- P1082||T1200 同余方程 codevs|| 洛谷
- hihoCoder 1369 网络流一·Ford-Fulkerson算法 (网络流学习#1 记录)
- 解决Linux下SSH等终端乱码问题