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

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

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

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

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


三带一别带自己,因为可以算在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. Windows 窗体中的事件顺序

    来自:https://docs.microsoft.com/zh-cn/dotnet/framework/winforms/order-of-events-in-windows-forms 对于依次处 ...

  2. Centos6.9下RocketMQ3.4.6高可用集群部署记录(双主双从+Nameserver+Console)

    之前的文章已对RocketMQ做了详细介绍,这里就不再赘述了,下面是本人在测试和生产环境下RocketMQ3.4.6高可用集群的部署手册,在此分享下: 1) 基础环境 ip地址 主机名 角色 192. ...

  3. php5.6安装Zend Opcache扩展

    假设php5.6安装路径为/data2/php[root@nextcloud src]# pwd/usr/local/src[root@nextcloud src]# wget http://pecl ...

  4. Linux课题实践三——程序破解

    2.3   程序破解 20135318 刘浩晨 1.     掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即“空指令”.执行到NOP指令时,CPU什么也不做,仅仅当做一 ...

  5. Maven遇到github引用的项目有bug怎么办?

    Maven遇到github引用的项目有bug,自己想要修复/作者已经修复了但是还没有版本出来. 一个maven的做法 git clone 该项目(可能直接下载zip比较快). 在项目中mvn inst ...

  6. Eclipse——Note

    Eclipse中常用的快捷键 快捷键 功能                                                                            

  7. 第五届蓝桥杯C++B组 地宫取宝

    代码: #include <bits/stdc++.h> using namespace std; #define ll long long const ll mod = 1e9 + 7; ...

  8. 搭建Spark所遇过的坑

    一.经验 1.Spark Streaming包含三种计算模式:nonstate .stateful .window 2.kafka可通过配置文件使用自带的zookeeper集群 3.Spark一切操作 ...

  9. matplotlib绘图3

    #scatter fig=plt.figure() ax=fig.add_subplot(3,3,1)#3行3列 第一个图 n=128 X=np.random.normal(0,1,n) Y=np.r ...

  10. Log4j 日志操作包配置详解

    log4j简介 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护 ...