题面

题意:4个人围一圈坐着,每个人13张牌,然后从第一个人开始,必须按照A-K的顺序出牌,一个人出牌后,剩下的人依次可以选择是否质疑他,例如,第一个人现在必须出8(因为按照A-K顺序轮到了),可是他没有或者有,无论如何他会说,我出了x个8,这x张牌就背面朝上的放在桌上,如果有人质疑,才会翻开,然后如果发现这并不是x个8,第一个人就要把桌子上所有的牌收回手上,如果是x个8,这个人就要自己把所有牌收回去,最先出完牌的人,且没有被质疑成功的,就是赢家,输出最后4个人手上的剩下牌。然后给出了4个人的牌型,和策略。

题解:模拟,耐心模拟。坑在于中间要求字典序最小,10<2<3<...<9<A<J<K<Q 而不是A<J<Q<K(调了3h才发现。)

 #include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
struct Node
{
int cnt[];
void clear()
{
for (int i=;i<=;i++) cnt[i]=;
}
bool empty()
{
for (int i=;i<=;i++)
if(cnt[i]) return ;
return ;
}
int get()
{
if(cnt[]) return ;
for (int i=;i<=;i++) if(cnt[i]) return i;
if (cnt[]) return ;
if (cnt[]) return ;
if (cnt[]) return ;
if (cnt[]) return ;
return ;
}
int fuckget()
{
int num=INF,index;
if (cnt[]<num&&cnt[]>=)
{
num=cnt[];
index=;
}
for (int i=;i<=;i++)
if(cnt[i]<num&&cnt[i]>=)
{
num=cnt[i];
index=i;
}
if (cnt[]<num&&cnt[]>=)
{
num=cnt[];
index=;
}
if (cnt[]<num&&cnt[]>=)
{
num=cnt[];
index=;
}
if (cnt[]<num&&cnt[]>=)
{
num=cnt[];
index=;
}
if(cnt[]<num&&cnt[]>=)
{
num=cnt[];
index=;
}
return index;
}
int del(int i) {cnt[i]--;}
int add(int i) {cnt[i]++;}
}node[],discard;
char s[];
void insert(int index)
{
int len=strlen(s);
if(s[]==''&&s[]=='')
{
node[index].cnt[]++;
return;
}
char ch=s[];
if(ch=='A') node[index].cnt[]++;
else if(ch=='J') node[index].cnt[]++;
else if(ch=='Q') node[index].cnt[]++;
else if(ch=='K') node[index].cnt[]++;
else node[index].cnt[ch-'']++;
}
int calc(int x)
{
x=x+;
if(x==) x=;
return x;
}
void jianpai(int index)
{
for (int i=;i<=;i++) node[index].cnt[i]+=discard.cnt[i];
discard.clear();
}
void out(int x) {
if(x==) printf("A");
else if(x>=&&x<=) printf("%d",x);else
if(x==) printf("J");else
if(x==) printf("Q");else
if(x==) printf("K");
}
vector<int> vec;
int main()
{
while(~scanf("%s",s))
{
for (int i=;i<=;i++)node[i].clear();
discard.clear();
insert();
for (int i=;i<=;i++)
{
scanf("%s",s);
insert();
}
for (int i=;i<=;i++)
for (int j=;j<=;j++)
{
scanf("%s",s);
insert(i);
}
int index=,need=;
while()
{
bool ok=false;
for (int i=;i<=;i++)
{
if(node[i].empty())
{
ok=true;
break;
}
}
if(ok) break;
if(index==)
{
if(node[index].cnt[need])
{
node[index].del(need);
discard.add(need);
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[p].cnt[calc(need)]==)
{
jianpai(p);
break;
}
}else
if(p==)
{
if(node[index].empty())
{
jianpai(p);
break;
}
}
}
}else
{
int fuck=node[index].get();
node[index].del(fuck);
discard.add(fuck);
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[p].cnt[calc(need)]==)
{
jianpai(index);
break;
}
}else
if(p==) {
if(node[p].cnt[need]==) {
jianpai(index);
break;
}
}else
if(node[index].empty()) {
jianpai(index);
break;
}
}
}
}else
if(index==)
{
if(node[index].cnt[need])
{
while(node[index].cnt[need])
{
node[index].del(need);
discard.add(need);
}
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[p].cnt[need]==)
{
jianpai(p);
break;
}
}else if(p==)
{
if(node[index].empty())
{
jianpai(p);
break;
}
}
}
}else
{
int fuck=node[index].get();
node[index].del(fuck);
discard.add(fuck);
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[p].cnt[need]==)
{
jianpai(index);
break;
}
}else if(p==)
{
if(node[index].empty())
{
jianpai(index);
break;
}
}else
{
if(+node[p].cnt[need]>)
{
jianpai(index);
break;
}
}
}
}
}else
if(index==)
{
if(node[index].cnt[need])
{
while(node[index].cnt[need])
{
node[index].del(need);
discard.add(need);
}
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[index].empty())
{
jianpai(p);
break;
}
}
}
}else
{
int num=;
int fuck=node[index].fuckget();
while(node[index].cnt[fuck])
{
node[index].del(fuck);
discard.add(fuck);
num++;
}
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[index].empty())
{
jianpai(index);
break;
}
}else if(p==)
{
if(num+node[p].cnt[need]>)
{
jianpai(index);
break;
}
}
}
}
}else
{
if(node[index].cnt[need]>=)
{
while(node[index].cnt[need])
{
node[index].del(need);
discard.add(need);
}
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[p].cnt[calc(need)]==)
{
jianpai(p);
break;
}
}
}
}else
if(node[index].cnt[need]>=)
{
int num=;
while(node[index].cnt[need])
{
node[index].del(need);
discard.add(need);
num++;
}
int fuck=node[index].get();
if(fuck)
{
num++;
node[index].del(fuck);
discard.add(fuck);
}
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[p].cnt[calc(need)]==)
{
if(fuck) jianpai(index);
else jianpai(p);
break;
}
if(num+node[p].cnt[need]>)
{
jianpai(index);
break;
}
}
}
}else
{
int fuck=node[index].get();
node[index].del(fuck);
discard.add(fuck);
for (int i=;i<=;i++)
{
int p=(index+i)%;
if(p==)
{
if(node[p].cnt[calc(need)]==)
{
jianpai(index);
break;
}
if(node[p].cnt[need]+>)
{
jianpai(index);
break;
}
}else
if(p==)
{
if(node[p].cnt[need]==)
{
jianpai(index);
break;
}
}
}
}
}
need=calc(need);
index=(index+)%;
}
for (int i=;i<=;i++)
{
if(node[i].empty()) puts("WINNER");else
{
vec.clear();
for (int j=;j<=;j++)
for (int k=;k<=node[i].cnt[j];k++) vec.push_back(j);
int len=(int)vec.size();
for (int i=;i<=len-;i++)
{
out(vec[i]);
if(i==len-) printf("\n");
else printf(" ");
}
}
}
}
return ;
}

hihoCoder-1830 2018亚洲区预选赛北京赛站网络赛 C.Cheat 模拟的更多相关文章

  1. hihoCoder #1831 : 80 Days-RMQ (ACM/ICPC 2018亚洲区预选赛北京赛站网络赛)

    水道题目,比赛时线段树写挫了,忘了RMQ这个东西了(捞) #1831 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an int ...

  2. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】

    任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...

  3. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B Tomb Raider 【二进制枚举】

    任意门:http://hihocoder.com/problemset/problem/1829 Tomb Raider 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 L ...

  4. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛D-80 Days--------树状数组

    题意就是说1-N个城市为一个环,最开始你手里有C块钱,问从1->N这些城市中,选择任意一个,然后按照顺序绕环一圈,进入每个城市会有a[i]元钱,出来每个城市会有b[i]个城市,问是否能保证经过每 ...

  5. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...

  6. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 80 Days(尺取)题解

    题意:n个城市,初始能量c,进入i城市获得a[i]能量,可能负数,去i+1个城市失去b[i]能量,问你能不能完整走一圈. 思路:也就是走的路上能量不能小于0,尺取维护l,r指针,l代表出发点,r代表当 ...

  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛

    题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...

  8. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II(优先队列广搜)

    #include<bits/stdc++.h> using namespace std; ; ; char G[maxN][maxN]; ]; int n, m, sx, sy, ex, ...

  9. hihoCoder-1828 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II BFS

    题面 题意:N*M的网格图里,有起点S,终点T,然后有'.'表示一般房间,'#'表示毒气房间,进入毒气房间要消耗一个氧气瓶,而且要多停留一分钟,'B'表示放氧气瓶的房间,每次进入可以获得一个氧气瓶,最 ...

随机推荐

  1. 【Oracle】客户端监听配置

    首先找到oracle软件安装的目录,找到\product\11.2.0\client_1\network\admin,打开tnsnames.ora文件: 粘贴一下内容: LISTENER= (DESC ...

  2. 图像局部显著性—点特征(Fast)

    fast作为几乎最快的角点检测算法,一般说明不附带描述子.参考综述:图像的显著性检测--点特征 详细内容,请拜访原=文章:Fast特征点检测算法 在局部特征点检测快速发展的时候,人们对于特征的认识也越 ...

  3. 【sqli-labs】 less10 GET - Blind - Time based. - Double quotes (基于时间的双引号盲注)

    这个和less9一样,单引号改完双引号就行了 http://localhost/sqli/Less-10/?id=1" and sleep(5)%23 5s后页面完成刷新 http://lo ...

  4. Centos6.6 安装Redis

    一.介绍 redis在做数据库缓存,session存储,消息队列上用的比较多 二.安装 $ yum install -y wget gcc make tcl $ wget http://downloa ...

  5. Vim入门基础知识集锦

        1. 简介 Vim(Vi[Improved])编辑器是功能强大的跨平台文本文件编辑工具,继承自Unix系统的Vi编辑器,支持Linux/Mac OS X/Windows系统,利用它可以建立.修 ...

  6. 微信小程序—picker(滚动选择器)

    官方api:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html 上边是官网的api.小程序中,底部下拉滚动选择主要有这几种 ...

  7. Robot Framework(五)使用测试库

    使用测试库 测试库包含那些最低级别的关键字,通常称为 库关键字,实际上与被测系统交互.所有测试用例总是使用某些库中的关键字,通常是通过更高级别的用户关键字.本节介绍如何使用测试库以及如何使用它们提供的 ...

  8. webpack command not found 的意外的坑 - 原因是从node开始

    写给自己做个记录: 弄了半天 执行了下面操作 npm install webpack -g 因为小白不懂原理,所以执行了好遍,结果还是如题, webpack command not found 网上搜 ...

  9. js:重复输出字符串中字符

    复习了 重复输出一个字符串后, 重复输出一个字符串是 比如给定 str:abc  num:3 要求输出 abcabcabc 文章链接:https://www.cnblogs.com/mobu/p/98 ...

  10. POJ3069 Saruman's Army【贪心】

    Saruman the White must lead his army along a straight path from Isengard to Helm's Deep. To keep tra ...