bzoj 1860: [Zjoi2006]Mahjong麻将 题解
【原题】
1860: [Zjoi2006]Mahjong麻将
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 211 Solved: 122
[Submit][Status]
Description

Input
Output
Sample Input
2 4 0 0 0 0 0 …… 0(一共98个0)
2 4 2 0 0 0 0 …… 0(一共97个0)
2 3 2 0 0 0 0 …… 0(一共97个0)
Sample Output
Yes
No
HINT
Source
【分析1】原来记得也有一道麻将的判和问题(当然不是国家集训队的那道)。
当时随便用贪心使过去了。可是这里3张牌和4张牌结合在了一起,于是贪心肯定挂了。然后就百思不得其解。
瞄了一眼题解:原来是爆搜。然后開始自己YY。由于最多是三张连续的牌,所以假设1--K-1张牌都没了,第K张牌一定仅仅会影响到K+1和K+2。
然后我就把K去爆搜。
显然光是这样肯定T了。
假设我把1--K-1以多种方法所有消掉了,第K种的状态就仅仅需搜一遍就可以。因此我依据K,K+1,K+2眼下的数量以及K的位置HASH一下。
PS:用了凌神的64位自然溢出。
【代码1】
#include<cstdio>
#include<set>
using namespace std;
typedef unsigned long long ULL;
set<ULL>S;ULL base[101],a[101],mul=97;
inline ULL calc(int k) {return base[k]*a[k]+base[k+1]*a[k+1]+base[k+2]*a[k+2];}
int Test,i;
inline bool dfs(int k,bool two)
{
ULL t=calc(k);
if (S.find(t)!=S.end())
return 0;
S.insert(t);
while (!a[k]) k++;
if (k==101) return two;
if (a[k]&&a[k+1]&&a[k+2])
{
a[k]--;a[k+1]--;a[k+2]--;
if (dfs(k,two)) return 1;
a[k]++;a[k+1]++;a[k+2]++;
}
if (a[k]>=4)
{
a[k]-=4;if (dfs(k,two)) return 1;a[k]+=4;
}
if (a[k]>=3)
{
a[k]-=3;if (dfs(k,two)) return 1;a[k]+=3;
}
if (a[k]>=2&&!two)
{
a[k]-=2;if (dfs(k,1)) return 1;a[k]+=2;
}
return 0;
}
int main()
{
base[1]=1;for (i=2;i<=100;i++) base[i]=base[i-1]*mul;
scanf("%d",&Test);
while (Test--)
{
for (i=1;i<=100;i++) scanf("%lld",&a[i]);
S.clear();
if (dfs(1,0)) puts("Yes");else puts("No");
}
return 0;
}
【分析2】上述做法尽管例子过了。可是狂WA不止。后来发现这种状态数太多了,HASH肯定会被卡掉。在WCY大神的指导下。我发现仅仅需把K+1~N的情况哈希一下,这样子状态数显然变小了。
【代码】
#include<cstdio>
#include<set>
using namespace std;
typedef unsigned long long ULL;
set<ULL>S;ULL base[105],a[105],sum,mul=131ll;
int Test,i;
inline bool dfs(int k,bool two,ULL status)
{
if (S.find(status)!=S.end()) return 0;
S.insert(status);
while (!a[k]&&k<=100) k++;
if (k==101) return two;
if (a[k]&&a[k+1]&&a[k+2]&&k<=98)
{
a[k]--;a[k+1]--;a[k+2]--;
if (dfs(k,two,status-base[k]-base[k+1]-base[k+2])) return 1;
a[k]++;a[k+1]++;a[k+2]++;
}
if (a[k]>=4)
{
a[k]-=4;if (dfs(k,two,status-base[k]*4)) return 1;a[k]+=4;
}
if (a[k]>=3)
{
a[k]-=3;if (dfs(k,two,status-base[k]*3)) return 1;a[k]+=3;
}
if (a[k]>=2&&!two)
{
a[k]-=2;if (dfs(k,1,status-base[k]*2-base[100])) return 1;a[k]+=2;
}
return 0;
}
int main()
{
base[1]=1ll;for (i=2;i<=100;i++) base[i]=base[i-1]*mul;
scanf("%d",&Test);
while (Test--)
{
sum=0;for (i=1;i<=100;i++) scanf("%lld",&a[i]),sum+=base[i]*a[i];
S.clear();
if (dfs(1,0,sum)) puts("Yes");else puts("No");
}
return 0;
}
bzoj 1860: [Zjoi2006]Mahjong麻将 题解的更多相关文章
- [BZOJ1860][ZJOI2006]Mahjong(DP)
1860: [Zjoi2006]Mahjong麻将 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 412 Solved: 248[Submit][Sta ...
- BZOJ 4033: [HAOI2015]树上染色题解
BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...
- BZOJ 1861: [Zjoi2006]Book 书架 splay
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...
- 【DP/二分】BZOJ 1863:[Zjoi2006]trouble 皇帝的烦恼
863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 465 Solved: 240[Submit][ ...
- BZOJ 1003 [ZJOI2006]物流运输trans
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4242 Solved: 1765[Submit] ...
- [ZJOI2006]超级麻将
题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...
- bzoj 1003 [ZJOI2006]物流运输(最短路+dp)
[ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8973 Solved: 3839[Submit][Status][Di ...
- BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)
Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
随机推荐
- Cognos Report Studio 链接查询需要注意的地方2
在Report Studio里面用SQL设计报表,查询2,查询3 要链接一般按条件 a1=b1 在选择链接方式需要注意的地方: 默认链接 外部链接 需要设置打开FM,打开报表设计引用的数据包(FM- ...
- 在ubuntu下手机无法挂载的问题
在ubuntu下手机无法挂载的问题 , 原因之一是,usb数据线连接在了机箱前面,可以尝试连接到机箱后面的USB接口试试,我当时遇到过这样的情况,这样解决的.
- 一段遍历4X4表格,取出每个单元格内容组合成文本的JS代码
遍历表格的JS容易忘,留个随笔以备忘. var tableData=""; var table=document.getElementById("XXTableId ...
- uploadify的java应用
API:http://www.uploadify.com/documentation/ 下载地址:http://www.uploadify.com/ 这几天查看插件,发现uploadify插件做不错, ...
- mysql字符集说明
mysql字符集说明 一.mysql中涉及的几个字符集 Ø character-set-server/default-character-set:服务器字符集,默认情况下所采用的. Ø charact ...
- C#.NET常见问题(FAQ)-如何把写好的类编译成dll文件
1 新建一个类库项目 2 直接改写这个Class1.cs文件 3 记得要添加Windows.Forms引用 4 我直接把在别的项目中做好的cs文件搞到这里来,连文件名也改了(FilesDi ...
- TextView跑步灯效果及在特殊情况下无效的解决方式
概述: 关于在TextView中使用跑马灯效果的样例在网上一搜一大把.他们可能会让你像以下这样来在xml中定义TextView控件的属性.而事实也确是如此. 只是我不知道他们有没有遇到和我一样的问题( ...
- 网上下载的 chm 文件打开后右侧内容显示空白
有时候在网上下载的chm文件打不开,或者打开后右侧内容显示空白,可尝试以下方法解决. 1.当你第一次打开文件时,会弹出如下警告窗口,点击打开: 打开后发现不管你怎么点,右边始终是空白的,有时候也会提示 ...
- Strange Addition
http://codeforces.com/problemset/problem/305/A 这题就是意思没看懂,一开始以为只要个位数只要一个为0就能相加,没想到到CF里面提交第三组就过不了,才发现是 ...
- Linux文件类型(学习笔记六)
一.Linux下的文件类型 普通文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ - ] 目录文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ d ] 设备文件:一般都 ...