Luogu 2668 [NOIP2015]斗地主
打牌技术不精,没有把$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]斗地主的更多相关文章
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[Submit][Status] ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- [补档][NOIP2015] 斗地主
[NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- 2106. [NOIP2015] 斗地主
2106. [NOIP2015] 斗地主 ★★★☆ 输入文件:landlords.in 输出文件:landlords.out 简单对比 时间限制:2 s 内存限制:1025 M ...
- NOIP2015斗地主题解 7.30考试
问题 B: NOIP2015 斗地主 时间限制: 3 Sec 内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...
随机推荐
- 前端开发笔记--flex布局
flex布局: 个人觉得flex布局比起传统布局要优先得多(主要是容易使用),缺点是IE10及以上版本才能使用,甚至某些属性只有在IE11才能使用(而且我发现凡是不兼容主要IE的坑来的多,不是说其他浏 ...
- ELK常用API使用方法
以下ELK系列文章参考自http://www.tianyiqingci.com/ 总目录: Monitor API ElasticSearch聚合分析API Elasticsearch信息检索API ...
- tomcat报错:Wrapper cannot find servlet class ...
tomcat发布工程时,在浏览器输入正确的地址,遇到如下问题: HTTP Status 500 - javax.servlet.ServletException: Wrapper cannot fin ...
- 超链接向servlet传参数
超链接传参数方式如下: <a href=xxxServlet?flag=1 target=“XX”></a> 注意:target=“XX”是用来指定在什么窗体打开.xx为该窗 ...
- ffmpeg处理RTMP流媒体的命令和发送流媒体的命令(UDP,RTP,RTMP)
将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName re限制输出速率, ...
- ACM学习历程—UESTC 1218 Pick The Sticks(动态规划)(2015CCPC D)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 题目大意就是求n根木棒能不能放进一个容器里,乍一看像01背包,但是容器的两端可以溢出容器,只要两端的木 ...
- BZOJ2288:[POJ Challenge]生日礼物
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ1113:[POI2008]PLA
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- JUST第二界算法设计大赛题解
1.问题描述: 悠悠假期同叔叔一起去书店,他选中了六本书,每本书的单价(单位:元)分别为:3.1,1.7,2,5.3,0.9 和7.2.不巧的是,叔叔只带了十几块钱,为了让悠悠高兴,叔叔同意买书,但提 ...
- 一个能获取如果hash或search是中文的内容小例子
代码: (function () { var url = "http//baidu.com#a=你好&b=world"; var url1 = "http//ba ...