noip斗地主
题解:
5分钟看题
25分钟码完
然后调了一下
样例1s???
好吧我把只出一张牌当成决策了。。
判断了一下前面没有出牌再考虑这个决策(是不是傻逼??)
交上去65
于是愉快的改状压
改到一半的时候想到 没有办法出牌就直接return了。。
交上去 a了
继续写状压
的确状压还是快了10倍+的
不过毕竟没有用什么贪心能100ms出解就不错了。。
好像很多人都是用贪心的。。
但是贪心正确性显然是错的啊。。。
好像说3连是没用的,那显然全是三连就一步啊。。。
先打4带2那要是都是一个4张其他都是连着3张显然也不对啊。。。
加强版那题 4个1可以当成2对 这题目都没说清楚。。
代码:
暴力:
// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
// J 11 Q 12 K 13 A 14 2 15
int T,n,a[],ans,p;
void dfs(int n,int cnt)
{
bool tt=;
p++;
if (cnt>=ans) return;
ans=min(ans,cnt+n);
if (!n) return;
int sum[];
sum[]=;
rep(i,,) if (a[i]) sum[i]=sum[i-]+;
else sum[i]=sum[i-];
rep(i,,)
rep(j,i+-,)
{
if (sum[j]-sum[i-]!=j-i+) break;
rep(k,i,j) a[k]--;
tt=;
dfs(n-(j-i+),cnt+);
rep(k,i,j) a[k]++;
}
rep(i,,) if (a[i]>) sum[i]=sum[i-]+;
else sum[i]=sum[i-];
rep(i,,)
rep(j,i+-,)
{
if (sum[j]-sum[i-]!=j-i+) break;
rep(k,i,j) a[k]-=;
tt=;
dfs(n-(j-i+)*,cnt+);
rep(k,i,j) a[k]+=;
}
rep(i,,) if (a[i]>) sum[i]=sum[i-]+;
else sum[i]=sum[i-];
rep(i,,)
rep(j,i+-,)
{
if (sum[j]-sum[i-]!=j-i+) break;
rep(k,i,j) a[k]-=;
tt=;
dfs(n-(j-i+)*,cnt+);
rep(k,i,j) a[k]+=;
}
rep(i,,)
if (a[i]==)
{
a[i]-=;
rep(i1,,)
rep(i2,i1+,)
{
if (a[i1]&&a[i2])
{
a[i1]--; a[i2]--;
tt=;
dfs(n-,cnt+);
a[i1]++; a[i2]++;
if (a[i1]>&&a[i2]>)
{
a[i1]-=; a[i2]-=;
dfs(n-,cnt+);
a[i1]+=; a[i2]+=;
}
}
}
a[i]+=;
}
if (a[]&&a[])
{
tt=;
a[]=a[]=; dfs(n-,cnt+);
a[]=a[]=;
}
rep(i,,)
if (a[i]==)
{
tt=;
a[i]=; dfs(n-,cnt+);
a[i]=;
}
rep(i,,)
if (a[i]>=)
{
tt=;
a[i]-=; dfs(n-,cnt+);
rep(j,,)
{
if (a[j])
{
a[j]--; dfs(n-,cnt+); a[j]++;
if (a[j]>)
{
a[j]-=; dfs(n-,cnt+); a[j]+=;
}
}
}
a[i]+=;
}
rep(i,,)
if (a[i]>=)
{
tt=;
a[i]-=; dfs(n-,cnt+);
a[i]+=;
}
}
int main()
{
freopen("1.in","r",stdin);
freopen("2.out","w",stdout);
ios::sync_with_stdio(false);
cin>>T>>n;
rep(sb,,T)
{
int x,y;
me(a);
rep(i,,n)
{
cin>>y>>x;
if (y==)
if (x==) a[]++;
else a[]++;
else
{
int kk=y;
if (kk==) kk=;
if (kk==) kk=;
a[kk]++;
}
}
ans=n;
dfs(n,);
cout<<ans<<endl;
}
// cout<<p<<endl;
return ;
}
状压(记忆化搜索):
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
// J 11 Q 12 K 13 A 14 2 15
int T,n,a[],ans,p;
const int N=9e6;
int f[N];
int o[][];
queue<int> q;
void minn(int &x,int y)
{
if (x>y) x=y;
}
int dfs(int n,int cnt,int now)
{
if (f[now])
{
ans=min(ans,cnt+f[now]);
return(f[now]);
}
int tmp=now; f[now]=n; q.push(now);
p++;
ans=min(ans,cnt+n);
if (!n) return();
if (cnt>=ans) return();
int sum[];
sum[]=;
rep(i,,) if (a[i]) sum[i]=sum[i-]+;
else sum[i]=sum[i-];
rep(i,,)
rep(j,i+-,)
{
if (sum[j]-sum[i-]!=j-i+) break;
rep(k,i,j)
{
now^=<<(o[k][a[k]]-);
a[k]--;
}
minn(f[tmp],+dfs(n-(j-i+),cnt+,now));
rep(k,i,j) a[k]++; now=tmp;
}
rep(i,,) if (a[i]>) sum[i]=sum[i-]+;
else sum[i]=sum[i-];
rep(i,,)
rep(j,i+-,)
{
if (sum[j]-sum[i-]!=j-i+) break;
rep(k,i,j)
{
now^=<<(o[k][a[k]]-);
now^=<<(o[k][a[k]-]-);
a[k]-=;
}
minn(f[tmp],+dfs(n-(j-i+)*,cnt+,now));
rep(k,i,j) a[k]+=; now=tmp;
}
rep(i,,) if (a[i]>) sum[i]=sum[i-]+;
else sum[i]=sum[i-];
rep(i,,)
rep(j,i+-,)
{
if (sum[j]-sum[i-]!=j-i+) break;
rep(k,i,j)
{
now^=<<(o[k][a[k]]-);
now^=<<(o[k][a[k]-]-);
now^=<<(o[k][a[k]-]-);
a[k]-=;
}
minn(f[tmp],+dfs(n-(j-i+)*,cnt+,now));
rep(k,i,j) a[k]+=; now=tmp;
}
rep(i,,)
if (a[i]==)
{
now^=<<(o[i][]-);
now^=<<(o[i][]-);
now^=<<(o[i][]-);
now^=<<(o[i][]-);
int tmp2=now;
a[i]-=;
rep(i1,,)
rep(i2,i1+,)
{
if (a[i1]&&a[i2])
{
now^=<<(o[i1][a[i1]]-);
now^=<<(o[i2][a[i2]]-);
a[i1]--; a[i2]--;
minn(f[tmp],+dfs(n-,cnt+,now));
a[i1]++; a[i2]++; now=tmp2;
if (a[i1]>&&a[i2]>)
{
now^=<<(o[i1][a[i1]]-);
now^=<<(o[i1][a[i1]-]-);
now^=<<(o[i2][a[i2]]-);
now^=<<(o[i2][a[i2]-]-);
a[i1]-=; a[i2]-=;
minn(f[tmp],+dfs(n-,cnt+,now));
a[i1]+=; a[i2]+=;
now=tmp2;
}
}
}
a[i]+=; now=tmp;
}
if (a[]&&a[])
{
now^=<<(o[][]-);
now^=<<(o[][]-);
a[]=a[]=;
minn(f[tmp],+dfs(n-,cnt+,now));
a[]=a[]=;
now=tmp;
}
rep(i,,)
if (a[i]==)
{
now^=<<(o[i][]-);
now^=<<(o[i][]-);
now^=<<(o[i][]-);
now^=<<(o[i][]-);
a[i]=; minn(f[tmp],+dfs(n-,cnt+,now));
a[i]=;
now=tmp;
}
rep(i,,)
if (a[i]>=)
{
now^=<<(o[i][a[i]]-);
now^=<<(o[i][a[i]-]-);
now^=<<(o[i][a[i]-]-);
int tmp2=now;
a[i]-=; minn(f[tmp],+dfs(n-,cnt+,now));
rep(j,,)
{
if (a[j])
{
now^=<<(o[j][a[j]]-);
a[j]--;
minn(f[tmp],+dfs(n-,cnt+,now)); a[j]++; now=tmp2;
if (a[j]>)
{
now^=<<(o[j][a[j]]-);
now^=<<(o[j][a[j]-]-);
a[j]-=;
minn(f[tmp],+dfs(n-,cnt+,now)); a[j]+=;
now=tmp2;
}
}
}
a[i]+=; now=tmp;
}
rep(i,,)
if (a[i]>=)
{
now^=<<(o[i][a[i]]-);
now^=<<(o[i][a[i]-]-);
a[i]-=;
minn(f[tmp],+dfs(n-,cnt+,now));
a[i]+=; now=tmp;
}
return(f[tmp]);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>T>>n;
rep(sb,,T)
{
while (!q.empty()) f[q.front()]=,q.pop();
int x,y;
me(a);
rep(i,,n)
{
cin>>y>>x;
if (y==)
if (x==) a[]++,o[][]=i;
else a[]++,o[][]=i;
else
{
int kk=y;
if (kk==) kk=;
if (kk==) kk=;
a[kk]++,o[kk][a[kk]]=i;
}
}
ans=n;
dfs(n,,(<<n)-);
cout<<ans<<endl;
}
// cout<<p<<endl;
return ;
}
noip斗地主的更多相关文章
- 【NOIP 2016】斗地主
题意 NOIP 2016 斗地主 给你一些牌,按照斗地主的出牌方式,问最少多少次出完所有的牌. 分析 这道题的做法是DFS. 为了体现这道题的锻炼效果,我自己写了好多个代码. Ver1 直接暴力搞,加 ...
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...
- NOIP原题 斗地主(20190804)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4&l ...
- 基础算法(搜索):NOIP 2015 斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- [BZOJ 4325][NOIP 2015] 斗地主
一道防AK好题 4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 820 Solved: 560[Submit] ...
- [NOIp 2015]斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- [NOIP 2015TG D1T3] 斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 【NOIP】提高组2015 斗地主
[题意]按照斗地主出牌规则,给定手牌求出完的最少步数. [算法]模拟+搜索 [题解] 可以发现除了顺子,其它的出牌规则都和点数无关,只与同点数的牌数有关. 所以可以先暴力枚举要出哪些顺子,然后每一个出 ...
随机推荐
- Vue 核心之数据劫持
前端界空前繁荣,各种框架横空出世,包括各类mvvm框架横行霸道,比如Angular.Regular.Vue.React等等,它们最大的优点就是可以实现数据绑定,再也不需要手动进行DOM操作了,它们实现 ...
- web@前端--html,css,javascript简介、第一个页面(常用标签简介)
1.什么是标签#1.在HTML中规定标签使用英文的的尖括号即`<`和`>`包起来,如`<html>`.`<head>`.`<body>`都是标签,#2. ...
- kerberos简单介绍
重要术语 1. KDC 全称:key distributed center 作用:整个安全认证过程的票据生成管理服务,其中包含两个服务,AS和TGS 2. AS 全称:authentication s ...
- (转)dubbo远程调用细节
作者: 白文志 (来自开源社区) 服务提供者暴露一个服务的详细过程 上图是服务提供者暴露服务的主过程:首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl) ...
- Android 通过Intent调用系统功能和Action动作和服务广播【大全】
1.从google搜索内容 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH);intent.putExt ...
- Java 调用翻译软件实现英文文档翻译
前言: 因最近要进行OCP的考试准备.看着大堆英文文档确实有些疼痛.又因文档内容有点大,又需要逐一去翻译 又很费时费力.于是 百度了一番,找到一些 可以使用Java来调用百度翻译软件的API( 注:( ...
- ORACLE的数据类型的长度合集
-- ORACLE的数据类型常用的数据库字段类型如下:字段类型 中文说明 限制条件 其它说明CHAR 固定长度字符串 最大长度2000 bytesVARCHAR2 可变长度的字符串 最大长度4000 ...
- Java9 新特性 详解
作者:木九天 < Java9 新特性 详解 > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...
- OCP 相关课程列表
OCP 相关课程列表 第一天:Linux基础 和 Oracle 11 R2 数据库安装教程图解 1:< VM 安装 linux Enterprise_R5_U4_Server_I386_DVD教 ...
- 拓展中国剩余定理(ex_crt)
一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...