hihoCoder-1830 2018亚洲区预选赛北京赛站网络赛 C.Cheat 模拟
阅读原文时间:2023年07月09日阅读:1

题面

题意: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
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[];
index=;
}
for (int i=;i<=;i++) if(cnt[i]=)
{
num=cnt[i];
index=i;
}
if (cnt[]=)
{
num=cnt[];
index=;
}
if (cnt[]=)
{
num=cnt[];
index=;
}
if (cnt[]=)
{
num=cnt[];
index=;
}
if(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 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 ;
}