24.02% 1000ms 262144K

“因材施教”的教育方式自古有之,互联网时代,要实现真正意义上的个性化教育,离不开大数据技术的扶持。VIPKID 英语 2020 多万学员每月在课前预习、课中教学、课后复习、作业、答题测评等环节会产生超过 100100 TB 的数据增量,在对庞大数据进行分析之后,个性化评测系统会自动生成针对每个学生的量化学习报告和个性化学习图谱。

正在拿着自己的个性化学习图谱总结分析的 Dino,看到走来的小明手中拿的麻将牌,心生一题,给小明出了一道难题:“你知道怎么输出听牌吗?”看到复杂的规则,小明皱起了眉毛,请你一起来帮小明解决吧!请看题:

在麻将游戏中,有 3434 种牌,分别是 1-91−9 的万,1-91−9 的筒,1-91−9 的条,以及 77 种字牌 “东”,“南”,“西”,“北”,“白”,“发”,“中”。

这 3434 种牌各四张,共 136136 张。

如果你手牌中凑够了 1414 张牌,满足一定的牌型条件,就称作“和牌”。

这个牌型有很多种,但在本题中,只考虑最基本的一种,44 个面子 + 11 个雀头组成的牌型。

面子是刻子和顺子的统称,雀头是对子。

刻子指的是,三张一样的牌。

顺子指的是,三张连续的牌,注意,只有非字牌(也就是万,筒,条)才能连续,例如一二三万,四五六筒,并且不能循环连续,比如九一二条就不算顺子。

对子指的是,两张一样的牌。

现在,zcy 手中有 1313 张牌,并且再得到某一张牌,就可以和牌,而你的目标就是输出能使 zcy 和牌的牌。

注意一种特殊情况,如果你手牌中某张牌有四张,而再得到这张牌也能和牌,这张牌在本题中不需要输出,因为这张牌总共就只有四张,不可能拿到手了。

(如果你知道什么是杠,请假装不能杠,如果你不知道,那就不需要知道了。)

输入格式

1-91−9 万用对应数字 + 一个小写 mm 表示

​1-91−9 条用对应数字 + 一个小写 ss 表示

​1-91−9 筒用对应数字 + 一个小写 pp 表示

​东南西北白发中分别用 1-71−7 的数字 + 一个小写 zz 表示

​输入多组数据,每组共 1313 个数字 + 字母的组合,用空格隔开

​输入保证有解

输出格式

对于每组数据,输出若干行,每行一个听牌,按照万,条,筒,字的顺序输出听牌,同类型按照数从小到大输出

数据组数不超过 1010 组

样例输入 复制

1s 2s 3s 4s 5s 6s 7s 8s 9s 1z 1z 3p 4p

样例输出 复制

2p

5p

题意:



思路:

用map把给定的13个的信息存储起来,然后枚举每一种牌为听牌,如果已有了4个,则不能继续加这个牌,否则就加这个牌去判断是否能和,能和就输出,否则不输出这个牌。

判断过程我是这样写的:

先枚举所有个数大于等于2的牌,减去两张这个牌(把它当成雀头|对子),然后去看剩下的12张牌是否能凑成4个顺子或者刻子,这一步我是对每一个类型的牌,从1到9枚举,如果个数大于等于三,先取出一个刻子,然后在根据后两个牌的个数信息确定是否能凑出顺子,因为我们从1到9的顺序去枚举,所以不用考虑一个牌个数大于等于3的时候是当刻子还是顺子,因为从1开始的时候,如果1的个数大于等于3,那么如果他能凑出三个顺子,那么也可以凑出三个刻子,所以忽略影响。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
char num;
char t;
map<pair<char,int>,int> m;
bool dfs()
{
map<pair<char,int>,int> f=m;
int res=0;
char lx;
int shu;
lx='m';
repd(i,1,9)
{
shu=i;
if(f[mp(lx,shu)]>=3)
{
res++;
f[mp(lx,shu)]-=3;
}
while(f[mp(lx,shu)]<=2&&f[mp(lx,shu)]>=1)
{
if(f[mp(lx,shu+1)]>=1&&f[mp(lx,shu+2)]>=1)
{
f[mp(lx,shu)]-=1;
f[mp(lx,shu+1)]-=1;
f[mp(lx,shu+2)]-=1;
res++;
}else
break;
}
}
lx='s';
repd(i,1,9)
{
shu=i;
if(f[mp(lx,shu)]>=3)
{
res++;
f[mp(lx,shu)]-=3;
}
while(f[mp(lx,shu)]<=2&&f[mp(lx,shu)]>=1)
{
if(f[mp(lx,shu+1)]>=1&&f[mp(lx,shu+2)]>=1)
{
f[mp(lx,shu)]-=1;
f[mp(lx,shu+1)]-=1;
f[mp(lx,shu+2)]-=1;
res++;
}else
break;
}
}
lx='p';
repd(i,1,9)
{
shu=i;
if(f[mp(lx,shu)]>=3)
{
res++;
f[mp(lx,shu)]-=3;
}
while(f[mp(lx,shu)]<=2&&f[mp(lx,shu)]>=1)
{
if(f[mp(lx,shu+1)]>=1&&f[mp(lx,shu+2)]>=1)
{
f[mp(lx,shu)]-=1;
f[mp(lx,shu+1)]-=1;
f[mp(lx,shu+2)]-=1;
res++;
}else
break;
}
}
lx='z';
repd(i,1,7)
{
shu=i;
if(f[mp(lx,shu)]>=3)
{
f[mp(lx,shu)]-=3;
res++;
}
}
return res>=4;
}
bool check()
{
char lx;
int shu;
lx='m';
repd(i,1,9)
{
shu=i;
if(m[mp(lx,shu)]>=2)
{
m[mp(lx,shu)]-=2;
if(dfs())
{
m[mp(lx,shu)]+=2;
return 1;
}
m[mp(lx,shu)]+=2;
}
}
lx='s';
repd(i,1,9)
{
shu=i;
if(m[mp(lx,shu)]>=2)
{
m[mp(lx,shu)]-=2;
if(dfs())
{
m[mp(lx,shu)]+=2;
return 1;
}
m[mp(lx,shu)]+=2;
}
}
lx='p';
repd(i,1,9)
{
shu=i;
if(m[mp(lx,shu)]>=2)
{
m[mp(lx,shu)]-=2;
if(dfs())
{
m[mp(lx,shu)]+=2;
return 1;
}
m[mp(lx,shu)]+=2;
}
}
lx='z';
repd(i,1,7)
{
shu=i;
if(m[mp(lx,shu)]>=2)
{
m[mp(lx,shu)]-=2;
if(dfs())
{
m[mp(lx,shu)]+=2;
return 1;
}
m[mp(lx,shu)]+=2;
}
}
return 0;
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
while(cin>>num>>t)
{
m.clear();
int n=num-'0';
m[mp(t,n)]++;
repd(i,2,13)
{
cin>>num>>t;
n=num-'0';
m[mp(t,n)]++;
}
t='m';
repd(i,1,9)
{
n=i;
if(m[mp(t,n)]<4)
{
m[mp(t,n)]++;
if(check())
{
cout<<n<<t<<endl;
}
m[mp(t,n)]--;
}
}
t='s';
repd(i,1,9)
{
n=i;
if(m[mp(t,n)]<4)
{
m[mp(t,n)]++;
if(check())
{
cout<<n<<t<<endl;
}
m[mp(t,n)]--;
}
}
t='p';
repd(i,1,9)
{
n=i;
if(n==3)
{
n=3;
}
if(m[mp(t,n)]<4)
{
m[mp(t,n)]++;
if(check())
{
cout<<n<<t<<endl;
}
m[mp(t,n)]--;
}
}
t='z';
repd(i,1,7)
{
n=i;
if(m[mp(t,n)]<4)
{
m[mp(t,n)]++;
if(check())
{
cout<<n<<t<<endl;
}
m[mp(t,n)]--;
}
} } return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

2019 计蒜之道 复赛 B. 个性化评测系统 (模拟,实现,暴搜)的更多相关文章

  1. 2019 计蒜之道 复赛 E. 撑起信息安全“保护伞” (贪心,构造,规律)

    为了给全球小学员打起信息安全"保护伞",VIPKID 还建立了一套立体化的安全防御体系,7 \times 247×24 小时持续安全监控与应急响应等多项联动,具备业界最高级别的数据 ...

  2. 2019 计蒜之道 复赛 D. “星云系统”(单调栈)

    VIPKID 是在线少儿英语教育平台,网络稳定是在线教育课程质量的红线,VIPKID 为此推出了全球最稳定的教育网络系统 -- "星云系统".星云系统目前建立了覆盖全球 3535 ...

  3. 2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)

    贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于  ...

  4. 2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治

    链接:https://nanti.jisuanke.com/t/11217 奉上官方题解: 枚举 d(x , y , z) 中的 y,把 y 从这个图中删去,再求这时的全源最短路即可,使用 Floyd ...

  5. 2016计蒜之道复赛 菜鸟物流的运输网络 网络流EK

    题源:https://nanti.jisuanke.com/t/11215 分析:这题是一个比较经典的网络流模型.把中间节点当做源,两端节点当做汇,对节点进行拆点,做一个流量为 22 的流即可. 吐槽 ...

  6. 2016计蒜之道复赛B题:联想专卖店促销

    题解 思路: 二分答案,设我们要check的值为x. 注意到每一个礼包都有,一个U盘,一个鼠标. 剩余的,分别为一个机械键盘,一个U盘,一个鼠标. 当礼包数目为x时,我们至多可以提供a-x个普通,b- ...

  7. 2016计蒜之道复赛 百度地图的实时路况(Floyd 分治)

    题意 题目链接 Sol 首先一个结论:floyd算法的正确性与最外层\(k\)的顺序无关(只要保证是排列即可) 我大概想到一种证明方式就是把最短路树上的链拿出来,不论怎样枚举都会合并其中的两段,所以正 ...

  8. 2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)

    B. 腾讯益智小游戏—矩形面积交(简单) 1000ms 262144K   腾讯游戏开发了一款全新的编程类益智小游戏,最新推出的一个小游戏题目是关于矩形面积交的.聪明的你能解出来吗?看下面的题目接招吧 ...

  9. 2019计蒜之道初赛3 D. 阿里巴巴协助征战SARS(困难)(大数取余+欧拉降幂)

    阿里巴巴协助征战SARS(困难) 33.29% 1000ms 262144K   目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA 的一条单链中,胞嘧啶.腺嘧啶均 ...

随机推荐

  1. Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

    if first time to install docker, be noted the docker engine started as root copied from: http://blog ...

  2. learning webrtc 使用node.js

    第二章 有使用node.js创建静态服务器的步骤 不过不够详细 下面以Windows为例 1.到官方网站下载安装包 然后安装 2.用管理员权限启动命令行 3.命令行窗口执行npm config set ...

  3. loj#6034 「雅礼集训 2017 Day2」线段游戏

    分析 区间李超树板子题 代码 #include<bits/stdc++.h> using namespace std; #define db double const int inf = ...

  4. Octavia 的 HTTPS 与自建、签发 CA 证书

    目录 文章目录 目录 Octavia 为什么需要自建 CA 证书? GenerateServerPEMTask CertComputeCreate Amphora Agent AmphoraAPICl ...

  5. USB转换PS2接线原理

    https://blog.csdn.net/dfyy88/article/details/4540170 USB转换PS2接线原理 2009年09月10日 18:36:00 阅读数:13285 USB ...

  6. 10 oracle bbed恢复ora-600[4193][4194]的错误

    ORA ] 错误解析 ERROR: Format: ORA ] [a] [b] VERSIONS: versions 6.0 to 12.1 DESCRIPTION: A mismatch has b ...

  7. pyinstaller如何将自己写的模块一并打包到exe中

    使用pyinstaller命令 pyinstaller -F main.py 打包时,若mian.py代码中存在引入自己写的模块,而打包成exe文件时,并不会自动引入自己写的模块,打包成功后,点击打开 ...

  8. 配置idea中类头注释中的 ${user} 自动获取电脑的名字,怎么去修改名字

    在idea安装路径下找到 idea\IntelliJ IDEA 2018.3.2\bin下面有一个文件叫:idea64.exe.vmoptions 编辑此文件就能修改主时钟自动获取的名称: 例如:添加 ...

  9. 25. Reverse Nodes in k-Group[H]k个一组翻转链表

    题目 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...

  10. [Web 前端] 031 bootstrap 的使用和全局 css 样式

    目录 0. 前言 1. 基本模板 2. 布局容器 2.1 container 2.2 container-fluid 3. 栅格系统 3.1 简介 3.2 栅格参数 3.3 实例:从堆叠到水平排列 2 ...