题解:

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斗地主的更多相关文章

  1. 【NOIP 2016】斗地主

    题意 NOIP 2016 斗地主 给你一些牌,按照斗地主的出牌方式,问最少多少次出完所有的牌. 分析 这道题的做法是DFS. 为了体现这道题的锻炼效果,我自己写了好多个代码. Ver1 直接暴力搞,加 ...

  2. Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)

    Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...

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

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

  4. NOIP原题 斗地主(20190804)

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

  5. 基础算法(搜索):NOIP 2015 斗地主

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

  6. [BZOJ 4325][NOIP 2015] 斗地主

    一道防AK好题 4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 820  Solved: 560[Submit] ...

  7. [NOIp 2015]斗地主

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

  8. [NOIP 2015TG D1T3] 斗地主

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

  9. 【NOIP】提高组2015 斗地主

    [题意]按照斗地主出牌规则,给定手牌求出完的最少步数. [算法]模拟+搜索 [题解] 可以发现除了顺子,其它的出牌规则都和点数无关,只与同点数的牌数有关. 所以可以先暴力枚举要出哪些顺子,然后每一个出 ...

随机推荐

  1. MySQL-mysql 8.0.12安装教程

    1.下载zip安装包 去官网下载MySQL8.0 For Windows zip包,下载地址:https://dev.mysql.com/downloads/mysql/ 2.安装 解压zip包到安装 ...

  2. "贪吃蛇"-css3效果

    clip  :  http://www.w3school.com.cn/cssref/pr_pos_clip.asp 姜糖水  :  http://www.cnphp6.com/archives/60 ...

  3. 028_shell脚本递归求值

    一. #!/bin/sh factorial() { if [ "$1" -gt "1" ]; then i=`expr $1 - 1` j=`factoria ...

  4. jquery datetimepicker

    1.详细说明见:https://xdsoft.net/jqplugins/datetimepicker/ 语言选择中文,现在lang配置已经失效;可用: $.datetimepicker.setLoc ...

  5. vscode 的使用笔记

    1.使用vscode 的终端命令 ctrl + ~  打开 vs 的终端 这是使用windows 自带的shell终端, 使用git.bash的shell  在设置里面,找到 terminal.int ...

  6. Sublime Text 3安装Package Control快速建立html5和xhtml文档

    Sublime Text 3安装Package Control快速建立html5和xhtml文档 先关闭Sublime text 3:第1步:下载sublime_package_control-mas ...

  7. maven:手动安装JAR到本地仓库

    mvn install:install-file -DgroupId=com.test -DartifactId=test -Dversion=1.0.0 -Dpackaging=jar -Dfile ...

  8. 【算法】狄克斯特拉算法(Dijkstra’s algorithm)

    狄克斯特拉算法(Dijkstra’s algorithm) 找出最快的路径使用算法——狄克斯特拉算法(Dijkstra’s algorithm). 使用狄克斯特拉算法 步骤 (1) 找出最便宜的节点, ...

  9. php如何实现图片点击下载,并保存本地?-----本例子为二维码的生成图片,并支持点击下载

    ### 今天因为工作需要,完成了一个二维码的生成图片,并支持点击下载的 ### 控制器文件,相关代码 // 生成二维码 $url = action('Apih5\\VersionController@ ...

  10. oracle数据库链路和同义词

    Oracle数据库链路的建立和使用 先来一个例子: --创建数据库链路create   public   database link xaffdblink connect to zdcl identi ...