好,终于搞完了这一道毒瘤题......

先想到搜索,然后想到状压,发现数据组数很多,又是随机,还是决定用搜索。

先搜出的多的,于是顺序是三个顺子,然后按照多到少搜带牌,最后是不带牌。

大体思路很简单,写起来很毒瘤...

注意很多细节...我就是一个地方没写上界导致数组越界了。


三带一别带自己,因为可以算在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 斗地主的更多相关文章

  1. 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]

    P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...

  2. [NOIP2015] 提高组 洛谷P2668 斗地主

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

  3. 洛谷P2668 斗地主 [NOIP2015]

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

  4. 洛谷P2668斗地主(搜索)noip2015

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

  5. 洛谷—— P2668 斗地主

    https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...

  6. 洛谷 P2668 斗地主

    毒瘤题目,搞了三天-- 也没什么好讲的,就是纯搜索,先搜顺子,再搜其他的,最后单张牌和对子的时候,就不要搜索了,直接枚举,不然会T飞掉多么痛的领悟-- 主要还是靠码力 #include<iost ...

  7. 题解【洛谷P2668】[NOIP2015]斗地主

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

  8. 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心

    题目:https://www.luogu.org/problemnew/show/P2668   https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...

  9. 【noip】跟着洛谷刷noip题

    传送门 1.铺地毯 d1t1 模拟 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> # ...

随机推荐

  1. Python - 列表解析式

    列表解析——用来动态地创建列表 [expr for iter_var in iterable if cond_expr] 例子一: map(lambda x: x**2, range(6)) [0, ...

  2. vs2015安装及初步试用

    Vs2015一直都听说好用,便捷.之前用vc++6.0,总感觉界面很灰,让人编程兴趣不高,恰巧借此机会,安装一下vs2015,从编译器上体验下编程的舒心,方便.希望我不会变得太懒... 首先,我下的是 ...

  3. rabbitMq实现与zookeeper类似的watcher功能

    场景:A.B.C.D(可以是一个机器的不同进程,也可以是不同机器的进程)启动了相同的项目,使用同一个数据库.但是,如果A修改了数据库的数据,需要B.C.D在很短的时间能够知道数据库发生了修改.当然可以 ...

  4. android计算器

    一:引言    目前手机可以说是普及率非常高的电子设备了,由于其便于携带,使用方便,资费适中等等原因,现在手机已经在一定程度开始代替固定电话的通话功能,以及一些原来电脑软件上的功能了.手机上的软件也随 ...

  5. github 学习心得

    https://github.com/kongxiangyu/test 通过本次实验,学会了如何使用github来管理代码.如果是开源的项目,通过网站托管方式进行统一管理,当然是非常棒的,并且有很多功 ...

  6. 『编程题全队』Beta 阶段用户使用调查报告

    目录 一.项目概述 1.1项目名称 1.2项目简介 1.3项目预期达到目标 1.4项目测试方法 二.项目测试过程 2.1测试对象 2.2测试时长 2.3用户测试反馈 一.项目概述 1.1项目名称 本次 ...

  7. ajax 异步请求 代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. HDU 2012 素数判定

    http://acm.hdu.edu.cn/showproblem.php?pid=2012 Problem Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括 ...

  9. [日常工作]Oracle12cr2在日常工作中遇到的不兼容的问题

    Oracle12c 数据库GS实例时需要使用新驱动,避免制单出现获取不到正确凭证编号内码的问题. Oracle12c 会产生大量的隐藏表,部分ddl语句会报错. Oracle12c 删除了VM_con ...

  10. ArrayMap代码分析

    Java提供了HashMap,但是HashMap对于手机端而言,对内存的占用太大,所以Android提供了SparseArray和ArrayMap.二者都是基于二分查找,所以数据量大的时候,最坏效率会 ...