hihoCoder-1830 2018亚洲区预选赛北京赛站网络赛 C.Cheat 模拟
题意: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 模拟的更多相关文章
- hihoCoder #1831 : 80 Days-RMQ (ACM/ICPC 2018亚洲区预选赛北京赛站网络赛)
水道题目,比赛时线段树写挫了,忘了RMQ这个东西了(捞) #1831 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an int ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】
任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B Tomb Raider 【二进制枚举】
任意门:http://hihocoder.com/problemset/problem/1829 Tomb Raider 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 L ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛D-80 Days--------树状数组
题意就是说1-N个城市为一个环,最开始你手里有C块钱,问从1->N这些城市中,选择任意一个,然后按照顺序绕环一圈,进入每个城市会有a[i]元钱,出来每个城市会有b[i]个城市,问是否能保证经过每 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(二进制枚举)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughter of a missing adv ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 80 Days(尺取)题解
题意:n个城市,初始能量c,进入i城市获得a[i]能量,可能负数,去i+1个城市失去b[i]能量,问你能不能完整走一圈. 思路:也就是走的路上能量不能小于0,尺取维护l,r指针,l代表出发点,r代表当 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛
题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...
- 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, ...
- hihoCoder-1828 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II BFS
题面 题意:N*M的网格图里,有起点S,终点T,然后有'.'表示一般房间,'#'表示毒气房间,进入毒气房间要消耗一个氧气瓶,而且要多停留一分钟,'B'表示放氧气瓶的房间,每次进入可以获得一个氧气瓶,最 ...
随机推荐
- Deutsch lernen (09)
1. die Rückmeldung, -en 反馈,回馈:(销假)报到 die Rückmeldung zur Arbeit 2. dringend a. 紧急的,急切的 Ich brauche d ...
- AI:IPPR的数学表示-CNN基本结构分析( Conv层、Pooling层、FCN层/softmax层)
类似于SVM,CNN为代表的DNN方法的边缘参数随着多类和高精度的要求必然增长.比如向量机方法,使用可以映射到无穷维的高斯核,即使进行两类分类,在大数据集上得到高精度,即保持准确率和高精度的双指标,支 ...
- Tinyxml2学习
转自http://www.360doc.com/content/13/1223/16/3684846_339528825.shtml,尊重原文 什么是XML? XML全称EXtensible Mark ...
- css3基础篇二
CSS3 边框 border-radius box-shadow border-image(ie不支持) 语法 border-radius: 1-4 length|% / 1-4 length|%; ...
- React Native Windows下环境安装(一)
1.安装chocolatey 以管理员权限运行命令提示符(cmd.exe) @powershell -NoProfile -ExecutionPolicy Bypass -Command " ...
- windows7下搭建HTTP服务器
打开控制面板,选择并进入“程序”,双击“打开或关闭Windows服务”,在弹出的窗口中选择“Internet信息服务”下面所有地选项,点击确定后,开始更新服务. 2 更新完成后,打开浏览器,输入“ ...
- UIAutomator定位简介
UIAutomator元素定位是 Android 系统原生支持的定位方式,虽然与 xpath 类似,但比它更加好用,且支持元素全部属性定位.定位原理是通过android 自带的android uiau ...
- [bzoj3291] Alice与能源计划 (二分图最大匹配)
传送门 Description 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系. ...
- linux邮件服务
linux本地常见邮件服务有: Centos5:默认使用sendmail邮件服务,开启方式/etc/init.d/sedmail start Centos6:默认使用postfix邮件服务,开启方式/ ...
- 一键安装LNMP(适合centos7)
1.准备工作,下载源码包 wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar ...