题面

题意: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. Linux学习自动化脚本(一)

    https://www.cnblogs.com/handsomecui/p/5869361.html https://blog.csdn.net/daigualu/article/details/76 ...

  2. MOOC推荐及三门基础学科

    top1:学堂在线 http://www.xuetangx.com/ top2:网易云课堂 http://study.163.com/ top3:coursera https://www.course ...

  3. js取最值:

    取最值是很常见的一种运算,各个语言都会遇到这个问题.Js中,如果简单的进行取最值,完全没必要自己写一个比较函数,原生的js就提供了方法.这些方法都属于Math 对象(引用w3c:Math 对象并不像 ...

  4. SqlLite提高批量插入速度的方法及原因分析

    (1)-SQLite忽略大小写查询大部分数据库在进行字符串比较时,对大小写是不敏感的.但是SQLite却是大小写敏感的.如果想让SQLite忽略大小写,方法如下:方法一:使用大小写转换函数LOWER. ...

  5. 【转载】VMware完全卸载

    出现安装时出现vmwareworkstationxxx.msi failed问题是官方解决方案...真心详细. http://kb.vmware.com/selfservice/microsites/ ...

  6. 【剑指Offer】16、合并两个排序的链表

      题目描述:   输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   解题思路:   首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个 ...

  7. SQL第三节课

    常用函数 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x ...

  8. [luogu2054 AHOI2005] 洗牌 (数论)

    传送门 Solution 我们考虑每一步牌的变化: 前半部分的牌位置*2 后半部分的牌位置*2-n-1 那么我们可以看做是\(x\times 2^m\equiv l \pmod n\) 于是求个逆元就 ...

  9. zabbix监控AIX DB2数据库

    记一次工作中使用zabbix监控aix db2数据库的经历. 记忆要点: 1.使用自定义perl脚本: 2.由于zabbix用户权限的原因,无法调用db2用户获取数据库的数据,所以在zabbix配置文 ...

  10. Java设计模式之 — 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9400141 今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务 ...