打牌技术不精,没有把$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. X-real-ip与X-Forwarded-For

    经过反向代理后,客户端与web服务器之间添加了中间层,因此: 1.代理服务器使用$remote_addr拿到的会是客户端的ip 2. web服务器使用$remote_addr拿到的会是代理服务器的ip ...

  2. Smarty 的安装

    1.下载Smarty包可以从官方站点下载:http://smarty.php.net/ 2.解压缩Smarty包解压后的文件夹重命名为Smarty,放置在C:\Apache2\include下 3.修 ...

  3. CDN存储和加速静态文件是什么回事(整理)(CDN是什么)

    CDN存储和加速静态文件是什么回事(整理)(CDN是什么) 一.总结 一句话总结: 内容分发网络:Content Delivery Network:依靠网络中的各个节点,就近发放静态资源. CDN的全 ...

  4. 分享知识-快乐自己:Hadoop 常用基础命令

    1): 查询目录下的文件 查询根目录: 查询文件夹下的文件: 2):创建文件夹 3):上传本地文件到HDFS中 上传多个文件: 4):删除文件 5):删除文件夹 6):从HDFS中复制文件到本地 7) ...

  5. POJ1363 Rails 验证出栈序列问题

    题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路: 1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适 ...

  6. 关于MFC主菜单和右键弹出菜单

    一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...

  7. codeforces 515C C. Drazil and Factorial(水题,贪心)

    题目链接: C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  8. linux命令学习笔记(41):ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前 那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程 ...

  9. Android之ExpandableList扩展用法(基于BaseExpandableListAdapter)

    1.简介 基于基于BaseExpandableListAdapter扩展的ExpandableList用法,现在网上流行的主要有两种:第一种是向BaseExpandableListAdapter传入两 ...

  10. 如何在MySQl数据库中给已有的数据表添加自增ID?

    由于使用MySQL数据库还没有多久的缘故,在搭建后台往数据库导入数据的时候发现新增的表单是没有自增id的,因次就有了上面这个问题. 解决方法 1.给某一张表先增加一个字段,这里我们就以node_tab ...