洛谷P2668 斗地主
好,终于搞完了这一道毒瘤题......
先想到搜索,然后想到状压,发现数据组数很多,又是随机,还是决定用搜索。
先搜出的多的,于是顺序是三个顺子,然后按照多到少搜带牌,最后是不带牌。
大体思路很简单,写起来很毒瘤...
注意很多细节...我就是一个地方没写上界导致数组越界了。
三带一别带自己,因为可以算在4不带里。
王可以当对子出,当单牌带,但是不能当对牌带。
4带2对是存在的。
王的读入是0 1和0 2,中间有空格...
函数调用我写的很多,复制粘贴时别写混了。
变量++找牌的时候,要规定上界。
大概就是这些了。
代码6K...
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N = ; int n, ans;
int bin[]; inline void out() {
for(int i = ; i <= ; i++) {
printf("%3d", bin[i]);
}
printf("%3d\n", bin[]);
return;
} inline void read() {
int x;
scanf("%d", &x);
if(x) {
if(x < ) {
x += ;
}
bin[x]++;
}
else {
bin[]++;
}
scanf("%d", &x);
return;
}
void DFS(int, int, int); void one_link(int rest, int time, int t, int pos) {
int l = std::max(pos, );
while(!bin[l] && l <= ) {
l++;
}
if(l >= ) {
DFS(rest, time, t + );
return;
}
int r = l + ;
while(r < && bin[r]) {
r++;
} if(r - l >= ) {
for(int j = l + ; j <= r; j++) {
for(int i = l; i < j; i++) {
bin[i]--;
}
one_link(rest - (j - l), time + , t, l);
for(int i = l; i < j; i++) {
bin[i]++;
}
}
}
one_link(rest, time, t, l + );
return;
} void two_link(int rest, int time, int t, int pos) {
int l = std::max(pos, );
while(bin[l] < && l <= ) {
l++;
}
if(l >= ) {
DFS(rest, time, t + );
return;
}
int r = l + ;
while(r < && bin[r] > ) {
r++;
} if(r - l >= ) {
for(int j = l + ; j <= r; j++) {
/// [l, j)
for(int i = l; i < j; i++) {
bin[i] -= ;
}
two_link(rest - * (j - l), time + , t, l);
for(int i = l; i < j; i++) {
bin[i] += ;
}
}
}
two_link(rest, time, t, l + );
return;
} void three_link(int rest, int time, int t, int pos) {
int l = std::max(pos, );;
while(bin[l] < && l <= ) {
l++;
}
if(l >= ) {
DFS(rest, time, t + );
return;
}
int r = l + ;
while(r < && bin[r] > ) {
r++;
} if(r - l >= ) {
for(int j = l + ; j <= r; j++) {
/// [l, j)
for(int i = l; i < j; i++) {
bin[i] -= ;
}
three_link(rest - * (j - l), time + , t, l);
for(int i = l; i < j; i++) {
bin[i] += ;
}
}
if(r - l > ) {
three_link(rest, time, t, l + );
}
else {
three_link(rest, time, t, r + );
}
}
else {
three_link(rest, time, t, r + );
}
return;
} void four_four(int rest, int time, int t, int pos) {
int p = std::max(pos, );
while(bin[p] < && p <= ) {
p++;
}
if(p == ) {
DFS(rest, time, t + );
return;
}
bin[p] -= ;
for(int i = ; i <= ; i++) {
if(bin[i] > ) {
bin[i] -= ;
for(int j = i; j <= ; j++) {
if(bin[j] > ) {
bin[j] -= ;
four_four(rest - , time + , t, p);
bin[j] += ;
}
}
bin[i] += ;
}
}
bin[p] += ;
four_four(rest, time, t, p + );
return;
} void four_two(int rest, int time, int t, int pos) {
int p = std::max(pos, );
while(bin[p] < && p <= ) {
p++;
}
if(p == ) {
DFS(rest, time, t + );
return;
}
bin[p] -= ;
for(int i = ; i <= ; i++) {
if(bin[i]) {
bin[i]--;
for(int j = i; j <= ; j++) {
if(bin[j]) {
bin[j]--;
four_two(rest - , time + , t, p);
bin[j]++;
}
}
bin[i]++;
}
}
bin[p] += ;
four_two(rest, time, t, p + );
return;
} void three_two(int rest, int time, int t, int pos) {
int p = std::max(, pos);
while(bin[p] < && p <= ) {
p++;
}
if(p == ) {
DFS(rest, time, t + );
return;
}
bin[p] -= ;
for(int i = ; i <= ; i++) {
if(bin[i] > ) {
bin[i] -= ;
three_two(rest - , time + , t, p);
bin[i] += ;
}
}
bin[p] += ;
three_two(rest, time, t, p + );
return;
} void three_one(int rest, int time, int t, int pos) {
int p = std::max(pos, );
while(bin[p] < && p <= ) {
p++;
}
if(p == ) {
DFS(rest, time, t + );
return;
}
bin[p] -= ;
for(int i = ; i <= ; i++) {
if(bin[i] && i != p) {
bin[i]--;
three_one(rest - , time + , t, p);
bin[i]++;
}
}
bin[p] += ;
three_one(rest, time, t, p + );
return;
} void DFS(int rest, int time, int t) {
if(!rest) {
ans = std::min(ans, time);
return;
}
if(time >= ans - ) {
return;
}
if(!t) {
one_link(rest, time, t, );
}
else if(t == ) {
two_link(rest, time, t, );
}
else if(t == ) {
three_link(rest, time, t, );
}
else if(t == ) {
four_four(rest, time, t, );
}
else if(t == ) {
four_two(rest, time, t, );
}
else if(t == ) {
three_two(rest, time, t, );
}
else if(t == ) {
three_one(rest, time, t, );
}
else {
int a = ;
for(int i = ; i <= ; i++) {
a += (bin[i] > );
}
ans = std::min(ans, time + a);
}
return;
} inline void solve() {
ans = ;
for(int i = ; i <= ; i++) {
ans += (bin[i] > );
}
DFS(n, , );
printf("%d\n", ans);
return;
} int main() {
int T;
scanf("%d%d", &T, &n);
while(T--) {
for(int i = ; i <= n; i++) {
read();
}
solve();
if(T) {
memset(bin, , sizeof(bin));
}
} return ;
}
AC代码
顺手把增强版也A了,跑的贼快。
数组300000是之前调的,忘了改回来。
洛谷P2668 斗地主的更多相关文章
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...
- [NOIP2015] 提高组 洛谷P2668 斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷P2668 斗地主 [NOIP2015]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷P2668斗地主(搜索)noip2015
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷—— P2668 斗地主
https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...
- 洛谷 P2668 斗地主
毒瘤题目,搞了三天-- 也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟-- 主要还是靠码力 #include<iost ...
- 题解【洛谷P2668】[NOIP2015]斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 $ A $ 到 $ K $ 加上大小王的共 $ 54 $ 张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据 ...
- 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心
题目:https://www.luogu.org/problemnew/show/P2668 https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...
- 【noip】跟着洛谷刷noip题
传送门 1.铺地毯 d1t1 模拟 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> # ...
随机推荐
- windows下docker启动.net core mvc随手记
docker基本命令: 查看当前的版本docker--version查看本地所有镜像:docker images查看当前正在运行的所有容器docker ps停止某个容器:docker stop 容器I ...
- [转载]sql 盲注之正则表达式攻击
[转载]sql 盲注之正则表达式攻击 -----------------------------------------MYSQL 5+-------------------------------- ...
- C. Meme Problem
链接 [http://codeforces.com/contest/1076/problem/C] 题意 a+b=d and a⋅b=d. 计算出a和b 分析 ab=a(d-a)=d aa-ad+d= ...
- doc窗口 输入命令net start mysql 服务名无效
解决方案: 1.win+R键输入cmd敲回车进入dos界面: 2.输入cd d:/mysql-5.5.25/bin敲回车,发现没变化: 3.输入d:敲回车,定位到d:\mysql-5.5.25\bin ...
- Linux内核及分析 第三周 Linux内核的启动过程
实验过程: 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootf ...
- 《Linux内核分析》 第八节 进程的切换和一般的执行过程
张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第八 ...
- Mooc总结——Linux内核分析
朱荟潼+ 原创作品转载请注明出处 :<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习笔记链接汇总 第 ...
- 五子棋游戏SRS
一.功能需求 1.绘制棋子 2.绘制界面 3.绘制棋盘 4.实现通过鼠标下棋并判断棋子是否落在棋盘上 6.判断胜负 二.用例图 玩家用例图: 1.落子:玩家鼠标点击最近的落子点落子.2.电脑先落子:选 ...
- 【目标跟踪】相关滤波算法之MOSSE
简要 2010年David S. Bolme等人在CVPR上发表了<Visual Object Tracking using Adaptive Correlation Filters>一文 ...
- js/jquery禁止页面回退
$(function() { //防止页面后退 history.pushState(null, null, document.URL); window.addEventListener('popsta ...