时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

Jack在和朋友们玩德国心脏病。

德国心脏病的游戏牌分为水果牌和动物牌。水果只有4种:香蕉、草莓、樱桃、柠檬,每张水果牌上会有种类不定、总数目1-5的水果;动物只有3种:猴子、大象、猪,每张动物牌上有且仅有一只动物。

n名玩家绕圈就座,第一轮游戏从0号至n-1号轮流出牌。每个玩家面前最多只有一张牌,如果玩家出牌时,他的面前已经摆放了一张牌,他新出的牌将会严丝合缝地盖住旧牌。

任何时候玩家可以选择按铃操作。如果按铃成功,玩家可以获得当前场上所有牌(包括被盖住的牌)并进入下一轮游戏,下一轮游戏由他先出牌,然后依序轮流出牌;否则,他需要支付给每位玩家一张手牌,然后他成为下一位出牌者,继续这一局游戏。

按铃成功的条件:

1、当前场上(被盖住的牌不算,以下同)某种水果的数量正好为5。

2、当前场上出现猴子,至少有一个水果,且没有出现柠檬。

3、当前场上出现大象,至少有一个水果,且没有出现草莓。

4、当前场上出现猪,且至少有一个水果。

Bob对这个游戏很感兴趣,他给了Jack一个操作序列,希望Jack输出最终每个人拥有的牌的数量。每名玩家初始拥有10,000,000张牌。操作分为两种:出牌或按铃。操作结束时游戏立即终止。

1、出牌的格式是:Fruit+水果数s+水果种类*s,0、1、2、3分别表示香蕉、草莓、樱桃、柠檬。如Fruit 4 0 2 2 2代表1个香蕉和3个樱桃的牌。或Animal+动物种类,0、1、2分别代表猴子、大象、猪。如Animal 0代表一张猴子牌。注意,选手需要自己计算出牌者是几号玩家。

2、按铃的格式是:Ring+选手编号。如Ring 2。

输入

第一行两个正整数n(≤10), k(≤100,000)。

接下来k行,每行对应一个操作。

输出

n行,每行一个整数,代表每个玩家游戏结束后拥有的牌的数目。

样例解释

3 13 # 井号后为样例输入说明:3名玩家,13次操作

Fruit 5 0 0 0 0 0 # 0号玩家出牌:5个香蕉

Ring 0 # 0号玩家按铃:按铃成功,获得场上的1张牌,开始下一轮游戏

Ring 1 # 1号玩家按铃:按铃失败,给0, 2号玩家各一张牌

Fruit 3 3 0 0 # 1号玩家出牌:1个柠檬+2个香蕉

Animal 0 # 2号玩家出牌:猴子

Fruit 4 2 2 2 2 # 0号玩家出牌:4个樱桃

Ring 2 # 2号玩家按铃:按铃失败,给0, 1号玩家各一张牌

Fruit 3 0 0 0 # 2号玩家出牌:3个香蕉,盖住上一张牌【猴子】

Fruit 2 0 0 # 0号玩家出牌:2个香蕉,盖住上一张牌【4个樱桃】

Ring 2 # 2号玩家按铃:按铃失败,给0, 1号玩家各一张牌

Animal 2 # 2号玩家出牌:猪,盖住上一张牌【3个香蕉】

Ring 0 # 0号玩家按铃:按铃成功,获得场上的6张牌,开始下一轮游戏

Animal 2 # 0号玩家出牌:猪,游戏终止

样例输入

3 13

Fruit 5 0 0 0 0 0

Ring 0

Ring 1

Fruit 3 3 0 0

Animal 0

Fruit 4 2 2 2 2

Ring 2

Fruit 3 0 0 0

Fruit 2 0 0

Ring 2

Animal 2

Ring 0

Animal 2

样例输出

10000006

9999999

9999994

一个简单的模拟。模拟两种动作,出牌和按铃。定义场上存在的牌面,因为会覆盖所以只要最后一次的牌面,一个N长度的数组就可以。

加上一个数组表示每个人桌子上自己跟前有几张牌,一个数组记录每个人手里有几张牌。

还有一个记录出牌人编号的游标。每次要对人数取模。

出牌的时候,清空自己的牌面,重新为牌面赋值,桌子上牌数量加一,手里牌数量减一。然后下一个人。

按铃的时候,单独函数判断牌面是否能按铃成功,然后处理。最后要把游标放到当前位置上。

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;const int N = 10 + 3;int n, k;
int owncard[N];
struct Card
{int type;int friut[4];int animial[3];
};Card Up[N];
int cardtotal[N];void init()
{for(int i = 0; i < n; i++){owncard[i] = 10000000;cardtotal[i] = 0; //桌上card
    }memset(Up, 0, sizeof(Up));
}char Type[30];int judge(int num)
{int totalfriut[4] = {0,0,0,0};for(int i = 0; i < n; i++){for(int j = 0; j < 4; j++)totalfriut[j] += Up[i].friut[j];}for(int i = 0; i < 4; i++){if(totalfriut[i] == 5)return 1;}int monkey = 0, pig = 0, elephent = 0;for(int i = 0; i < n; i++){if(Up[i].animial[0]) monkey = 1;if(Up[i].animial[1]) elephent = 1;if(Up[i].animial[2]) pig = 1;}if(monkey && totalfriut[3] == 0 &&(totalfriut[0] || totalfriut[1] || totalfriut[2]) )return 1;if(elephent && totalfriut[1] == 0 &&(totalfriut[0] || totalfriut[3] || totalfriut[2]) )return 1;if(pig && (totalfriut[0] || totalfriut[3] || totalfriut[2] || totalfriut[1]))return 1;return 0;
}void solve()
{scanf("%d%d", &n, &k);init();int cur = 0;for(int i = 0; i < k ; i++){cur = cur % n;scanf("%s", Type);if(Type[0] == 'F'){owncard[cur]--;cardtotal[cur]++;Up[cur].type = 1;Up[cur].friut[0] = Up[cur].friut[1] = 0;Up[cur].friut[2] = Up[cur].friut[3] = 0;Up[cur].animial[0] = Up[cur].animial[1] = Up[cur].animial[2] = 0;int num,f;scanf("%d", &num);for(int j = 0; j < num; j++){scanf("%d", &f);Up[cur].friut[f]++;}cur++;}else if(Type[0] == 'A'){owncard[cur]--;cardtotal[cur]++;Up[cur].type = 2;Up[cur].friut[0] = Up[cur].friut[1] = 0;Up[cur].friut[2] = Up[cur].friut[3] = 0;Up[cur].animial[0] = Up[cur].animial[1] = Up[cur].animial[2] = 0;int num;scanf("%d", &num);Up[cur].animial[num] = 1;cur++;}else if(Type[0] == 'R'){int num;scanf("%d", &num);int isok = judge(num);if(isok){for(int j = 0; j < n; j++){owncard[num] += cardtotal[j];cardtotal[j] = 0;}memset(Up, 0, sizeof(Up));cur = num;}else{for(int j = 0; j < n; j++){if(j != num){owncard[num] -- ;owncard[j] ++;}}cur = num;}}}for(int i = 0; i < n; i++)printf("%d\n", owncard[i]);
}int main()
{solve();return 0;
}

转载于:https://www.cnblogs.com/Alruddy/p/7191415.html

HihoCode 1531 : 德国心脏病相关推荐

  1. hihocoder 1531 德国心脏病 (模拟)

    描述 Jack在和朋友们玩德国心脏病. 德国心脏病的游戏牌分为水果牌和动物牌.水果只有4种:香蕉.草莓.樱桃.柠檬,每张水果牌上会有种类不定.总数目1-5的水果:动物只有3种:猴子.大象.猪,每张动物 ...

  2. 寒假算法学习 OI生涯 - 悄无声息(模拟+线性DP优化) OI生涯 - 德国心脏病 (模拟)

    OI生涯 - 悄无声息 题目描述 「李」走路是没有动静的,如果你在干「李」不让你干的事情,他会神不知鬼不觉的走到你的身后,然后把你奶一顿! 因为你知道「李」走路没有动静,所以为了提防,可以认为「李」有 ...

  3. hihocoder 第280周德国心脏病c++

    #题目: Jack在和朋友们玩德国心脏病. 德国心脏病的游戏牌分为水果牌和动物牌.水果只有4种:香蕉.草莓.樱桃.柠檬,每张水果牌上会有种类不定.总数目1-5的水果:动物只有3种:猴子.大象.猪,每张 ...

  4. #1531:德国心脏病

    题目见这里 典型的模拟题,注意对于一名玩家前面的牌堆来说,仅最上面一张牌的内容有意义: 然后就是注意在"Ring" succeed后,所有玩家的playedCards清零. 代码如 ...

  5. 桌游“德国心脏病”的C语言代码实现

    目前C语言小白,刚接触C语言半年,最近借着学校课程设计的机会写了一个小游戏,打算分享出来. PS:由于本人代码水平很差,所以600行代码中有很多重复代码,程序的结构也不是太合理,如果有哪位大神感兴趣给 ...

  6. 桌游“德国心脏病”的python代码实现

    没错!C语言小白又开始学习python啦,现在光荣晋升一位python小白,于是我又用python重新编了一次之前的游戏,具体规则请参见我的上一篇文章. 遗憾的是,下面200行代码并没有涉及到面向对象 ...

  7. 德国公民信用相关数据_作为公民数据科学家,没有任何事

    德国公民信用相关数据 数据科学,意见(Data Science, Opinion) Dear Aspiring Data Scientist, 亲爱的有抱负的数据科学家, Before you sta ...

  8. The 14th Chinese Northeast Collegiate Programming Contest 补题

    题目链接 https://codeforces.com/gym/102801 参考题解 B - Team 简要题意: 给定 nnn 和 MMM,有三个组 ABCABCABC,每组 nnn 个人,每人都 ...

  9. 研究显示每天工作超8小时得心脏病概率增加80%,生命很重要,工作不要那个累。

    每天工作超过8小时的人患心脏病的风险最高可增加80%(资料图) 据英国<每日邮报>9月12日报道,芬兰职业保健研究所的科学家们近日进行了一项研究,他们发现每天工作超过8小时的人患心脏病的风 ...

最新文章

  1. 服务器送料器显示通讯异常,西门子贴片机常见故障处理思路和方法
  2. 【React自制全家桶】一、Webstrom+React+Ant Design+echarts搭建react项目
  3. 计算几何/sgu 124 Broken line
  4. kali下生成web端后门
  5. java初学者指南_Java代理初学者指南
  6. SQL Server中的T-SQL元数据功能的完整指南
  7. 为什么要追求“极简”代码?
  8. c语言程序 题库管理,C语言程序设计题库管理.doc
  9. 毕业设计-电子商务网站(二)
  10. hexo博客首页添加网易云音乐
  11. 优达学城 深度学习 任务1
  12. 联想电脑怎么进入bios设置u盘启动
  13. 【数据结构】栈的实现与简单应用
  14. 【CSS3动画】利用CSS3制作“百度浏览器”官网奔跑的北极熊效果(不含背景移动)
  15. 解决mysql load data加载本地null数据,表里出现0的情况
  16. C#生成Code128条形码
  17. python在姓名的左右_怎样用Python给宝宝取个好名字?
  18. 快速重装win10系统
  19. Java数据结构与算法:无向图,有向图,带权图,图的遍历,最小生成树
  20. 健身教练学习书籍推荐-结合知乎

热门文章

  1. 10 23 周总结+一道奇妙数论
  2. 百度员工一年挣多少钱?聊聊百度的薪资职级体系
  3. LED大屏分屏专业播放软件vMix Pro 19版一键和谐补丁永久使用
  4. Softmax分类器基本实现
  5. HTML学习笔记 解决div浮动 高度塌陷问题
  6. 100 行 Java 代码实现一个表情包生成器!
  7. Autosar MCAL-GTM之TOM
  8. Java取四位随机数
  9. 【Arduino】控制A4950的循迹小车设计
  10. JPG转CAD,怎样把JPG插入CAD图纸呢?