打牌技术不精,没有把$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. linux下安装telnet(centos7)

    1 环境 centos 7 yum已配置好 网络连接正常 2 检查是否已安装相关软件 rpm -qa|grep telnet 3 安装相关组件 yum install xinetd yum insta ...

  2. JDK8新特性:接口的静态方法和默认方法

    在jdk8之前,interface之中可以定义变量和方法,变量必须是public.static.final的,方法必须是public.abstract的.由于这些修饰符都是默认的,所以在JDK8之前, ...

  3. 英语发音规则---J字母

    英语发音规则---J字母 一.总结 一句话总结: j只发[dʒ]音:jeep [dʒiːp] n. :jail [dʒeɪl] n. jeep [dʒiːp] n. 吉普车 jar [dʒɑː] n. ...

  4. Hibernate学习---第七节:关联关系

    一.关联关系一对一外键(双向) 1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; /** * 持久化类设计 * 注意: ...

  5. Selenium-几种元素定位方式

    #识别元素并操作#一般有如下几种方法,其中id最为常用.这里需要注意识别元素一定要用唯一id 1.find_element_by_id("value") #! /usr/bin/e ...

  6. Tomcat_异常_02_IOException while loading persisted sessions: java.io.EOFException

    异常原因: EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败. 这是由于tomcat上次非正常关闭时有一些活动session被持久化(表现为一些临 ...

  7. 201621123014《Java程序设计》第四周学习总结

    1.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:继承.多态.子类.父类.final.static.类型判断与类型转换.抽象类. 1.2 尝试使用思维导图将这些关键词组织起来. ...

  8. json 文件解析与应用

    第一步:首先弄一个 json 文件   我这里成为 config.json 内容如下 { ": { , "desc":"中华人民共和国" }, &qu ...

  9. 【leetcode刷题笔记】N-Queens II

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  10. [基本操作]线段树分治和动态dp

    不知道为什么要把这两个没什么关系的算法放到一起写...可能是都很黑科技? 1.线段树分治 例题:bzoj4026 二分图 给你一个图,资瓷加一条边,删一条边,询问当前图是不是二分图 如果用 LCT 的 ...