题解:

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. 转-CSRF——攻击与防御

    0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/PO ...

  2. 数字证书及CA的扫盲介绍

    ★ 先说一个通俗的例子 考虑到证书体系的相关知识比较枯燥.晦涩.俺先拿一个通俗的例子来说事儿. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 ...

  3. selenium控制浏览器

    1.要把浏览器设置为全屏,否则有些元素是操作失败的,如对下图进行操作按钮是失败的,因为按钮没有显示出来 2.设置浏览器的宽.高 3.控制前进.后退(不建议使用driver.black().driver ...

  4. OpenStack实践系列④计算服务Nova

    OpenStack实践系列④计算服务Nova 3.6 Nova控制节点的部署创建服务的凭证,完成下列步骤: 创建nova用户,并加入到service项目中,赋予admin权限 [root@node1 ...

  5. Go Rand小结

    对于Random的使用,在业务中使用频率是非常高的,本文就小结下常用的方法: 在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto ...

  6. druid:java代码创建连接池

    PropertiesDB 是一个读取配置文件的类,也可以不用,每个参数直接用String代替. public DataSource dataSource(PropertiesDB properties ...

  7. ASP.NET如何下载大文件

    关于此代码的几点说明: 1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据. 2. 根据下载的文件类型来指定 Response.ContentType .(参考OSChina的 ...

  8. SQL Server 之 内部连接

    1.内部联接 2.外部联接 外部联接扩展了内部联接的功能,会把内联接中删除表源中的一些保留下来,由于保存下来的行不同,可将外部联接分为左联接和右联接. 2.1左联接: 如果左表的某一行在右表中没有匹配 ...

  9. 安装elasticsearch 5.x, 6.x 常见问题(坑)的解决

    本人在elasticsearch 5.x, 6.x 安装过程中遇到了一些问题: 警告提示 [2016-11-06T16:27:21,712][WARN ][o.e.b.JNANatives ] una ...

  10. 解决KafKa数据存储与顺序一致性保证

    “严格的顺序消费”有多么困难 下面就从3个方面来分析一下,对于一个消息中间件来说,”严格的顺序消费”有多么困难,或者说不可能. 发送端 发送端不能异步发送,异步发送在发送失败的情况下,就没办法保证消息 ...