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 斗地主
[题意]按照斗地主出牌规则,给定手牌求出完的最少步数. [算法]模拟+搜索 [题解] 可以发现除了顺子,其它的出牌规则都和点数无关,只与同点数的牌数有关. 所以可以先暴力枚举要出哪些顺子,然后每一个出 ...
随机推荐
- select2使用方法总结
官网:http://select2.github.io/ 调用 <link href="~/Content/select2.min.css" rel="styles ...
- 弹出框sweetalert插件的简单使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- OpenStack实践系列②认证服务Keystone
OpenStack实践系列②认证服务Keystone 三.实战OpenStack之控制节点3.1 CentOS7的时间同步服务器chrony 下载chrony # yum install -y chr ...
- 51nod--1264 线段相交 (计算几何基础, 二维)
题目: 1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为 ...
- docker的安装及使用
准备工具: 系统:ubuntu18.04 docker软件包:docker-compose.tar.gz,containerd.io_1.2.4-1_amd64.deb,docker-ce-cli_1 ...
- python-时间模块,random、os、sys、shutil、json和pickle模块
一.time与datetime模块 time模块: 时间戳:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,返回类型为float类型 格式化时间字符串(Format String) ...
- WebRequest使用(车)
// 待请求的地址 string url = "http://www.cnblogs.com"; // 创建 WebRequest 对象,WebRequest 是抽象类,定义了请求 ...
- (转)scikit-learn主要模块和基本使用方法
从网上看到一篇总结的很不错的sklearn使用文档,备份勿忘. 引言 对于一些开始搞机器学习算法有害怕下手的小朋友,该如何快速入门,这让人挺挣扎的.在从事数据科学的人中,最常用的工具就是R和Pytho ...
- Confluence 6 通过 SSL 或 HTTPS 运行 - 重定向所有的 URLS 到 HTTPS 的安全考虑
尽管现在 HTTPS 现在已经激活并且可用了.老的 HTTP URLs (http://localhost:8090)还是可以访问的.现在你需要重定向所有 URLs 到他们的 HTTPS 链接中.你可 ...
- usrp-B210
sudo add-apt-repository ppa:ettusresearch/uhd sudo apt-get update sudo apt-get install libuhd-dev li ...