打牌技术不精,没有把$A$放在顺子里面搜,WA了好长时间。

盗用大佬的一张图:

当时自己搜的时候没有把四张牌拆成三带一等情况。

然后还有一点就是四张三张都出完之后直接数一数剩下的一张两张牌还要多少次出完就好了,没有必要浪费栈空间和递归深度去搜这些东西。(我就是这样T了好多次QωQ)。

要注意暴力算的前提就是一定要把之前的三张四张打完。

玄学复杂度。

代码很丑很长。

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = ;
const int inf = << ; int testCase, n, cnt[N], ans; inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMin(int &x, int y) {
if(y < x) x = y;
} void dfs(int rest, int stp) {
if(stp >= ans) return;
if(rest == ) {
chkMin(ans, stp);
return;
} /* for(int j, i = 3; i <= 14; i++) {
if(cnt[i] < 1) continue;
for(j = i; j <= 14; j++)
if(cnt[j] < 1) break;
j--;
if(j - i + 1 < 5) {
i = j;
continue;
}
for(int k = i; k <= j; k++) --cnt[k];
dfs(rest - (j - i + 1), stp + 1);
for(int k = i; k <= j; k++) ++cnt[k];
i = j;
} for(int j, i = 3; i <= 14; i++) {
if(cnt[i] < 2) continue;
for(j = i; j <= 14; j++)
if(cnt[j] < 2) break;
j--;
if(j - i + 1 < 3) {
i = j;
continue;
}
for(int k = i; k <= j; k++) cnt[k] -= 2;
dfs(rest - (j - i + 1) * 2, stp + 1);
for(int k = i; k <= j; k++) cnt[k] += 2;
i = j;
} for(int j, i = 3; i <= 14; i++) {
if(cnt[i] < 3) continue;
for(j = i; j <= 14; j++)
if(cnt[j] < 3) break;
j--;
if(j - i + 1 < 2) {
i = j;
continue;
}
for(int k = i; k <= j; k++) cnt[k] -= 3;
dfs(rest - (j - i + 1) * 3, stp + 1);
for(int k = i; k <= j; k++) cnt[k] += 3;
i = j;
} */ /* for(int j, k, i = 2; i <= 14; i++) {
if(cnt[i] < 4) continue;
for(j = 2; j <= 15; j++) {
if(j == i) continue;
if(cnt[j] > 1) {
for(k = 2; k <= 15; k++) {
if(k == i) continue;
if(cnt[k] > 1) {
cnt[i] -= 4, cnt[j] -= 2, cnt[k] -= 2;
dfs(rest - 8, stp + 1);
cnt[i] += 4, cnt[j] += 2, cnt[k] += 2;
}
}
}
}
} for(int j, k, i = 2; i <= 14; i++) {
if(cnt[i] < 4) continue;
for(j = 2; j <= 15; j++) {
if(j == i) continue;
if(cnt[j] > 0) {
for(k = 2; k <= 15; k++) {
if(k == i) continue;
if(cnt[k] > 0) {
cnt[i] -= 4, --cnt[j], --cnt[k];
dfs(rest - 6, stp + 1);
cnt[i] += 4, ++cnt[j], ++cnt[k];
}
}
}
}
} for(int i = 2; i <= 14; i++) {
if(cnt[i] < 4) continue;
cnt[i] -= 4;
dfs(rest - 4, stp + 1);
cnt[i] += 4;
} for(int j, i = 2; i <= 14; i++) {
if(cnt[i] < 3) continue;
for(j = 2; j <= 15; j++) {
if(j == i) continue;
if(cnt[j] > 1) {
cnt[i] -= 3, cnt[j] -= 2;
dfs(rest - 5, stp + 1);
cnt[i] += 3, cnt[j] += 2;
}
}
} for(int j, i = 2; i <= 14; i++) {
if(cnt[i] < 3) continue;
for(j = 2; j <= 15; j++) {
if(j == i) continue;
if(cnt[j] > 0) {
cnt[i] -= 3, --cnt[j];
dfs(rest - 4, stp + 1);
cnt[i] += 3, ++cnt[j];
}
}
} for(int i = 2; i <= 14; i++) {
if(cnt[i] < 3) continue;
cnt[i] -= 3;
dfs(rest - 3, stp + 1);
cnt[i] += 3;
} */ int len = ;
for(int i = ; i <= ; i++) {
if(cnt[i] == ) len = ;
else {
++len;
if(len >= ) {
for(int j = i; j >= i - len + ; j--) cnt[j]--;
dfs(rest - len, stp + );
for(int j = i; j >= i - len + ; j--) cnt[j]++;
}
}
} len = ;
for(int i = ; i <= ; i++) {
if(cnt[i] <= ) len = ;
else {
++len;
if(len >= ) {
for(int j = i; j >= i - len + ; j--) cnt[j] -= ;
dfs(rest - len * , stp + );
for(int j = i; j >= i - len + ; j--) cnt[j] += ;
}
}
} len = ;
for(int i = ; i <= ; i++) {
if(cnt[i] <= ) len = ;
else {
len++;
if(len >= ) {
for(int j = i; j >= i - len + ; j--) cnt[j] -= ;
dfs(rest - len * , stp + );
for(int j = i; j >= i - len + ; j--) cnt[j] += ;
}
}
} for(int i = ; i <= ; i++) {
if(cnt[i] <= ) {
if(cnt[i] <= ) continue;
cnt[i] -= ;
for(int j = ; j <= ; j++) {
if(j == i || cnt[j] == ) continue;
cnt[j]--;
dfs(rest - , stp + );
cnt[j]++;
}
for(int j = ; j <= ; j++) {
if(j == i || cnt[j] <= ) continue;
cnt[j] -= ;
dfs(rest - , stp + );
cnt[j] += ;
}
cnt[i] += ;
} else {
cnt[i] -= ;
for(int j = ; j <= ; j++) {
if(j == i || cnt[j] == ) continue;
cnt[j]--;
dfs(rest - , stp + );
cnt[j]++;
}
for(int j = ; j <= ; j++) {
if(j == i || cnt[j] <= ) continue;
cnt[j] -= ;
dfs(rest - , stp + );
cnt[j] += ;
}
cnt[i] += ; cnt[i] -= ;
for(int j = ; j <= ; j++) {
if(j == i || cnt[j] == ) continue;
cnt[j]--;
for(int k = ; k <= ; k++) {
if(k == j || cnt[k] == ) continue;
cnt[k]--;
dfs(rest - , stp + );
cnt[k]++;
}
cnt[j]++;
} for(int j = ; j <= ; j++) {
if(j == i || cnt[j] <= ) continue;
cnt[j] -= ;
for(int k = ; k <= ; k++) {
if(k == j || cnt[k] <= ) continue;
cnt[k] -= ;
dfs(rest - , stp + );
cnt[k] += ;
}
cnt[j] += ;
}
cnt[i] += ;
}
} int now = ;
for(int i = ; i <= ; i++)
if(cnt[i]) ++now; chkMin(ans, stp + now);
} int main() {
// freopen("Sample.txt", "r", stdin);
// freopen("testdata.in", "r", stdin);
// freopen("my.txt", "w", stdout); read(testCase), read(n);
for(; testCase--; ) {
memset(cnt, , sizeof(cnt)); for(int x, y, i = ; i <= n; i++) {
read(x), read(y);
if(x == ) cnt[]++;
else {
if(x == ) cnt[]++;
else cnt[x]++;
}
} ans = inf;
dfs(n, ); printf("%d\n", ans);
}
return ;
}

Luogu 2668 [NOIP2015]斗地主的更多相关文章

  1. Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)

    Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...

  2. NOIP2015斗地主[DFS 贪心]

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  3. BZOJ 4325: NOIP2015 斗地主

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 684  Solved: 456[Submit][Status] ...

  4. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  5. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  6. LOJ2422 NOIP2015 斗地主 【搜索+贪心】*

    LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...

  7. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝

    [BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...

  8. 2106. [NOIP2015] 斗地主

        2106. [NOIP2015] 斗地主 ★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比 时间限制:2 s   内存限制:1025 M ...

  9. NOIP2015斗地主题解 7.30考试

    问题 B: NOIP2015 斗地主 时间限制: 3 Sec  内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...

随机推荐

  1. poj 3006 Dirichlet's Theorem on Arithmetic Progressions【素数问题】

    题目地址:http://poj.org/problem?id=3006 刷了好多水题,来找回状态...... Dirichlet's Theorem on Arithmetic Progression ...

  2. ACM,我回来了!

    经过两天的时间,到了家一趟! 我终于又重新回到ACM实验室了!,有点头晕啊!!!

  3. iptables原理及使用教程

    注意 修改iptables可能导致连接断开, 对于远程连接的用户, 需要在经过充分测试后在修改, 对于懒人可以设置一个crontab, 在你修改iptables的过程中每隔30分钟清空一次iptabl ...

  4. 在Treeview中节点的data属性中保存记录类型及其消除的办法

    一.保存记录类型在data指针中: procedure TForm1.getheaditems(pp:TfrxBand;hnode:THeadTreeNode;var i:Integer;var j: ...

  5. Linux课程---10、权限管理(权限有哪几种)

    Linux课程---10.权限管理(权限有哪几种) 一.总结 一句话总结: r 读 w 写 x 执行 1.drwxr-x---  2 root root  4096 Jan 20 19:39 mnt ...

  6. HTML5学习笔记——1

    1.视频 <vedio src  controls  height width autoplay loop preload > </vedio> <source src ...

  7. python glances来监控linux服务器CPU 内存 IO使用

    什么是 Glances? Glances 是一个由 Python 编写,使用 psutil 库来从系统抓取信息的基于 curses 开发的跨平台命令行系统监视工具. 通过 Glances,我们可以监视 ...

  8. Linux-awk command

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  9. Android学习路线01

    part1:Java 1.Java基础 2.Java面向对象 3.数组与集合,异常,常用类 4.Io流 5.多线程socket编程 6.数据库,网络传输,数据解析 part2:Android 1.An ...

  10. ffmpeg解码RTSP/TCP视频流H.264(QT界面显示视频画面)

    源码下载地址: http://download.csdn.net/detail/liukang325/9489952 我用的ffmpeg版本为 ffmpeg-2.1.8.tar.bz2 版本低了恐怕有 ...