题解:

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. PCM EQ DRC 音频处理

    PCM Pulse-code modulation的缩写,中文译名是脉冲编码调制.(I2S仅仅是PCM的一个分支,接口定义都是一样的, I2S的采样频率一般为44.1KHZ和48KHZ做,PCM采样频 ...

  2. 网站被k

    经常见到很多SEO人员的网站被搜索引擎K了,到处找所谓的SEO大神求助,最后还是无用功,作为优秀的SEO人员我们不能病急乱投医.接下来,我会着重讲解网站被K之后如何快速恢复的办法. 首先来说下网站被搜 ...

  3. openvpn 给客户端固定隧道IP地址

    openvpn 客户端拿到的ip地址是服务器端随机分配的,因此需要远程ssh到一个终端时,它的ip地址有时会变,如何给他固定IP地址呢. 方法如下: 1) 在服务器端使用的配置文件 server.co ...

  4. MSSQL—行转列

    行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...

  5. Codeforces 1110D Jongmah [DP]

    洛谷 Codeforces 我-我我把这-这这题切了??? 说实话这题的确不难,只是我看到有大佬没做出来有点慌-- 突然发现这题是我在洛谷的第500个AC呢.那就更要写篇题解纪念一下了. 思路 容易想 ...

  6. Synchronizing timer

    http://blog.csdn.net/zjq001x/article/details/53107159 集合点: 简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存 ...

  7. Ubuntu16.04安装JDK8与Tomcat7

      本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-105-generic x86_64) ...

  8. Confluence 6 附件存储文件系统的分级

    从 Confluence 3.0 开始,附件的存储方式有了重大的改变和升级.如果你是从 Confluence 2.10 及其早期版本升级上来的,请参考 Upgrading Confluence 页面中 ...

  9. linux之ab压力测试工具

    等待... https://www.cnblogs.com/myvic/p/7703973.html

  10. Best Cow Line(POJ3617)

    Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year&quo ...