Description

麻将是中国传统的娱乐工具之一。麻将牌的牌可以分为字牌(共有东、南、西、北、中、发、白七种)和序数牌(分为条子、饼子、万子三种花色,每种花色各有一到九的九种牌),每种牌各四张。在麻将中,通常情况下一组和了的牌(即完成的牌)由十四张牌组成。十四张牌中的两张组成对子(即完全相同的两张牌),剩余的十二张组成三张一组的四组,每一组须为顺子(即同花色且序数相连的序数牌,例如条子的三、四、五)或者是刻子(即完全相同的三张牌)。一组听牌的牌是指一组十三张牌,且再加上某一张牌就可以组成和牌。那一张加上的牌可以称为等待牌。  在这里,我们考虑一种特殊的麻将。在这种特殊的麻将里,没有字牌,花色也只有一种。但是,序数不被限制在一到九的范围内,而是在1到n的范围内。同时,也没有每一种牌四张的限制。一组和了的牌由3m + 2张牌组成,其中两张组成对子,其余3m张组成三张一组的m组,每组须为顺子或刻子。现给出一组3m + 1张的牌,要求判断该组牌是否为听牌(即还差一张就可以和牌)。如果是的话,输出所有可能的等待牌。
Input

包含两行。第一行包含两个由空格隔开整数n, m (9<=n<=400, 4<=m<=1000)。第二行包含3m + 1个由空格隔开整数,每个数均在范围1到n之内。这些数代表要求判断听牌的牌的序数。
Output

输出为一行。如果该组牌为听牌,则输出所有的可能的等待牌的序数,数字之间用一个空格隔开。所有的序数必须按从小到大的顺序输出。如果该组牌不是听牌,则输出"NO"。
Sample Input
9 4
1 1 2 2 3 3 5 5 5 7 8 8 8

Sample Output
6 7 9

囧,我一直以为以为直接搜索就行了,没有算时间

原来要贪心的选,先枚举要胡的,然后把能做刻子的都做刻子,剩下的都只能做顺子,扫一遍就出来了

代码就坑爹了,发现这个贪心之后,我直接把我暴力枚举的那一段中枚举刻子的个数的地方改成枚举最大刻子数的就可以了

 1 const
 2         maxn=410;
 3 var
 4         s:array[0..maxn]of longint;
 5         n,m:longint;
 6
 7 procedure init;
 8 var
 9         i,x:longint;
10 begin
11         read(n,m);
12         for i:=1 to 3*m+1 do
13           begin
14             read(x);
15             inc(s[x]);
16           end;
17 end;
18
19 function dfs(x:longint):boolean;
20 var
21         i,k:longint;
22 begin
23         while (s[x]=0) and (x<=n) do
24           inc(x);
25         if x>n then exit(true);
26         k:=s[x]mod 3;
27         for i:=s[x]div 3 to s[x]div 3 do
28           begin
29             dec(s[x+1],k);
30             dec(s[x+2],k);
31             if (s[x+1]>=0) and (s[x+2]>=0) then
32             if dfs(x+1) then
33             begin
34               inc(s[x+1],k);
35               inc(s[x+2],k);
36               exit(true);
37             end;
38             inc(s[x+1],k);
39             inc(s[x+2],k);
40             inc(k,3);
41           end;
42         exit(false);
43 end;
44
45 procedure work;
46 var
47         i,j:longint;
48         flag:boolean;
49 begin
50         flag:=false;
51         for i:=1 to n do
52           begin
53             inc(s[i]);
54             for j:=1 to n do
55               if s[j]>1 then
56               begin
57                 dec(s[j],2);
58                 if dfs(1) then
59                 begin
60                   inc(s[j],2);
61                   if flag=false then write(i)
62                   else write(' ',i);
63                   flag:=true;
64                   break;
65                 end;
66                 inc(s[j],2);
67               end;
68             dec(s[i]);
69           end;
70         if flag=false then write('NO');
71 end;
72
73 begin
74         init;
75         work;
76 end.

View Code

转载于:https://www.cnblogs.com/Randolph87/p/3633115.html

1028: [JSOI2007]麻将 - BZOJ相关推荐

  1. 1028: [JSOI2007]麻将

    1028: [JSOI2007]麻将 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2638  Solved: 1168 [Submit][Statu ...

  2. bzoj 1028: [JSOI2007]麻将

    暴力枚举+贪心 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include< ...

  3. [JSOI2007]麻将

    https://www.zybuluo.com/ysner/note/1218522 题面 有\(3m+1\)张牌,范围\(1-n\),询问插入哪一张牌后,可以使牌由一个对子(\(2\)张相同牌).\ ...

  4. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

  5. OI 刷题记录——每周更新

    每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...

  6. 2019.3.summary

    emmmm,把以前写的2b总结丢上来吧,不过应该也不会有人看QAQ (注:因为用txt写的,有一些公式打的很随意,放到markdown上公式自动排版,有可能会显示出错误!可在下方留言) 2019.2. ...

  7. BZOJ.1032.[JSOI2007]祖码(区间DP)

    题目链接 BZOJ 洛谷 AC代码: 区间DP,f[i][j]表示消掉i~j需要的最少珠子数. 先把相邻的相同颜色的珠子合并起来. 枚举方法一样,处理一下端点可以碰撞消除的情况就行. 当然合并会出现问 ...

  8. BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3953  Solved: 1614 [Submit][St ...

  9. BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )

    为什么我的后缀数组跑得这么慢... 把字符串复制一遍放在最后, 然后跑sa, 扫一遍就行了... --------------------------------------------------- ...

  10. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

最新文章

  1. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
  2. 记一次Quartz重复调度(任务重复执行)的问题排查
  3. 如何去除C#Strings中的空格?
  4. idea配置tomcat以及环境变量
  5. php开发地图导航,php 实现百度地图(很详细出来的地图)
  6. 南非世界杯火热角逐 金山网盾开启搜索保护
  7. 宏定义不是c语言语句 行末不必加分号,模拟C语言试题-02(2).doc
  8. 使用proteus8.9进行跑马灯程序仿真
  9. 国外在线Md5,md4,mysql,Sha1,NTLM破解网站
  10. 【c语言大作业】c语言编写贪吃蛇
  11. 双网卡上网冲突解决_交换机如何设置,控制IP地址冲突故障
  12. 笔记本如何解除锁定计算机,笔记本键盘锁定解锁方法教程
  13. 深度学习 - 其本质是什么?
  14. 推荐系统论文笔记(1):Hybrid Recommender Systems:Survey and Experiments
  15. 二进制(二):十进制转二进制的两种方法
  16. 中专在学校里考的计算机四级证属于中级职业技能证书吗?
  17. 电子科大互加软基课程设计
  18. 14. 查询表sc——查询学生201215121选修课程的总学分数。
  19. 课程学习之计算机网络
  20. 2018中国移动和电信浙江分公司宁波校招笔试面试

热门文章

  1. Spring Security 安全框架概述 与 快速入门
  2. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_05-vuejs研究-vuejs基础-v-text指令...
  3. jdk环境配置-windows 10
  4. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战...
  5. 阶段3 2.Spring_06.Spring的新注解_6 Qualifier注解的另一种用法
  6. GitHub 简单教程
  7. Linux入门之常用命令(10)软连接 硬链接
  8. ios判断点击的坐标点
  9. 学习笔记:工厂方法模式及简单工厂模式的对比
  10. jdk基础之Object类getClass()方法