毫无意义的一道题。

用pai[i]表示某种点数的牌的剩余量,used[i]表示单,对,三,四的出牌数,大力分类讨论,大力dfs即可。。。真奇葩。。。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T,n,ans,pai[20],used[6];
void dfs(int kth,int v) {
if(kth>14) {
int nxt=v,a=used[1],b=used[2],c=used[3],d=used[4];
if(d>=(a>>1)) nxt-=a-(a&1),d-=a>>1,a&=1;
else nxt-=d<<1,a-=d<<1,d=0;
if(d>=(b>>1)) nxt-=b-(b&1),d-=b>>1,b&=1;
else nxt-=d<<1,b-=d<<1,d=0;
if(d>=b) nxt-=b,d-=b,b=0;
if(c>=a) nxt-=a,c-=a,a=0;
else nxt-=c,a-=c,c=0;
if(c>=b) nxt-=b,c-=b,b=0;
else nxt-=c,b-=c,c=0;
ans=min(ans,nxt);return;
}
if(!pai[kth]) {dfs(kth+1,v);return;}
int now=-1;
if(kth>=3) {
for(int i=kth;i<=14;i++) {
if(pai[i]<3) break;
now=i;pai[i]-=3;
if(i-kth+1>=2) dfs(kth,v+1);
}
for(int i=kth;i<=now;i++) pai[i]+=3;
now=-1;
for(int i=kth;i<=14;i++) {
if(pai[i]<2) break;
now=i;pai[i]-=2;
if(i-kth+1>=3) dfs(kth,v+1);
}
for(int i=kth;i<=now;i++) pai[i]+=2;
now=-1;
for(int i=kth;i<=14;i++) {
if(!pai[i]) break;
now=i;
pai[i]--;
if(i-kth+1>=5) dfs(kth,v+1);
}
for(int i=kth;i<=now;i++) pai[i]++;
}
if(pai[kth]==4) {
pai[kth]-=4;
used[4]++;dfs(kth+1,v+1);used[4]--;
used[3]++,used[1]++,dfs(kth+1,v+2);used[3]--,used[1]--;
used[2]+=2;dfs(kth+1,v+2);used[2]-=2;
pai[kth]+=4;
}
else if(pai[kth]==3) {
pai[kth]-=3;
used[3]++;dfs(kth+1,v+1);used[3]--;
used[2]++,used[1]++,dfs(kth+1,v+2),used[2]--,used[1]--;
pai[kth]+=3;
}
else if(pai[kth]==2) {pai[kth]-=2;used[2]++;dfs(kth+1,v+1);used[2]--;pai[kth]+=2;}
else if(pai[kth]==1) {pai[kth]--;used[1]++;dfs(kth+1,v+1);used[1]--;pai[kth]++;}
}
int main() {
scanf("%d%d",&T,&n);
while(T--) {
ans=9999999;
memset(pai,0,sizeof pai);memset(used,0,sizeof used);
for(int i=1,a,b;i<=n;i++) {scanf("%d%d",&a,&b);if(a==0) pai[b-1]++;else if(a==1) pai[14]++;else pai[a]++;}
if(pai[0]&&pai[1]) pai[0]--,pai[1]--,dfs(2,1),pai[0]++,pai[1]++,dfs(0,0);
else dfs(0,0);
printf("%d\n",ans);
}
}

[NOIPlus]斗地主的更多相关文章

  1. NOIP2015斗地主[DFS 贪心]

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

  2. Android斗地主棋牌游戏牌桌实现源码下载

    本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下: 为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity package com.biso ...

  3. Android开源益智游戏“斗地主”单机版源代码

     Android开源益智游戏"斗地主"单机版源代码 这是一个网上流传的Android开源斗地主单机版项目,运行结果如图: 项目源代码导入到Eclipse后可直接运行,我把ecl ...

  4. [NOIP2015] 斗地主(搜索)

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

  5. Java基础之如何解决斗地主问题

        难的是逻辑的分析,把逻辑转化成代码是一种能力,这种能力需要多练习总结.     多多指教,共同进步. 问题: 要求实现斗地主游戏发牌过程,打印三个玩家的牌和底牌.在不看底牌的情况下,统计出三个 ...

  6. Java写的斗地主游戏源码

    源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序.一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”, ...

  7. 斗地主(Noip2015Day1T3)

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

  8. BZOJ 4325: NOIP2015 斗地主

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 684  Solved: 456[Submit][Status] ...

  9. UOJ147 斗地主

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

随机推荐

  1. [luogu4053 JSOI2007] 建筑抢修 (贪心 优先队列)

    传送门 题目描述 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤 ...

  2. win10 1809磁盘占用总是100%

    快过年了,提前请假回家,装几台电脑公司备用.有个电脑装完系统开机很慢,开机完成之后电脑响应也很慢,于是打开任务管理器发现磁盘中用率一直是100%,然而程序读取数据的速度并不高. 解决思路: 关闭win ...

  3. 2019-03-28 SQL inner left full

    在使用 join 时,on 和 where 条件的区别如下: 1. on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录. 2.where 条件是在临时表生成好 ...

  4. php循环练习题

    1.通过for循环将数组中值求和.求平均值 <?php $num=[1,2,3,4,5,6,7,8,9]; $sum = 0; for ($i=0,$n=count($num); $i < ...

  5. HTTP中的重定向和请求转发的区别(转)

    时间长有些忘了,转篇文章加深一下印象: 一.调用方式 我们知道,在servlet中调用转发.重定向的语句如下:request.getRequestDispatcher("new.jsp&qu ...

  6. Java - 经常使用函数Random函数

    http://blog.csdn.net/pipisorry/article/details/44411541 Random()函数生成随机数 java.util.Random 在Java的API帮助 ...

  7. Java笔试面试题001

    Java笔试面试题之中的一个 1.Struts1中actionform和action属于MVC哪一层,为什么? 解答:actionform和action属于MVC的Model层,Action用来处理业 ...

  8. Methods Collection of Enumerating Com Port in Windows, by C

    According to this stack overflow thread, PJ Naughter has implemented 9 methods to emunerate com port ...

  9. Python 下的 return 关键字

    def make_sum(a, b): return ('+', a, b) >> make_sum(1, 2) ('+', 1, 2) 显示地返回一个元组(tuple),当然 retur ...

  10. Oracle数据库中闪回恢复的详细分析

    Oracle9i开始提供闪回查询,以便能在需要的时候查到过去某个时刻的一致性数据,这是通过Undo实现的.这个功能有很大的限制,就是相关事务的undo不能被覆盖,否则就无力回天了.oracle10g大 ...