题目

#include<bits/stdc++.h>
using namespace std;
int pai[20],T;
//pai[]统计牌的数量
int n;
int ans;
void shunzi(int step);//顺子
void feiji(int step);//飞机
void liandui(int step);//连对
int sanpai();
void chupai(int step){
if (step>=ans)
return;
ans=min(ans,step+sanpai());
feiji(step);
shunzi(step);
liandui(step);
}
void shunzi(int step){
int l=0;
for (int i=3;i<=13;i++){
l=0;
while (pai[i+l]>=1)
l++;
for (int j=l;j>=5;j--){
for (int k=i;k<=i+j-1;k++)
pai[k]=pai[k]-1;
chupai(step+1);
for (int k=i;k<=i+j-1;k++)
pai[k]=pai[k]+1;
}
}
}
void feiji(int step){
int l=0;
for (int i=3;i<=13;i++){
l=0;
while (pai[i+l]>=3)
l++;
for (int j=l;j>=2;j--){
for (int k=i;k<=i+j-1;k++)
pai[k]=pai[k]-3;
chupai(step+1);
for (int k=i;k<=i+j-1;k++)
pai[k]=pai[k]+3;
}
}
}
void liandui(int step){
int l=0;
for (int i=3;i<=13;i++){
l=0;
while (pai[i+l]>=2)
l++;
for (int j=l;j>=3;j--){
for (int k=i;k<=i+j-1;k++)
pai[k]=pai[k]-2;
chupai(step+1);
for (int k=i;k<=i+j-1;k++)
pai[k]=pai[k]+2;
}
}
}
int sanpai(){
bool wangzha=false; // 可不可以王炸
if (pai[1]==2)
wangzha=true;
int zhangshu[5];
memset(zhangshu,0,sizeof(zhangshu));
for (int i=2;i<=14;i++)
zhangshu[pai[i]]++;
zhangshu[1]+=pai[1];
int num=0;
if (zhangshu[2]==0&&zhangshu[3]==0&&zhangshu[4]==0&&wangzha==false)
return zhangshu[1];
if (zhangshu[2]==0&&zhangshu[3]==0&&zhangshu[4]==0&&wangzha)
return zhangshu[1]-1; //以下1、2、3、4都代表出一种有1或2或3或4张的牌
//炸->3+1 * 4+2 + 3+1 step 2
while (!zhangshu[3]&&zhangshu[4]>=2&&zhangshu[1]==1&&zhangshu[2]==1){
zhangshu[4]--;
zhangshu[4]--;
zhangshu[1]--;
zhangshu[2]--;
num=num+2;
}
//3->2+1 * 4+2 3+1 step 2
while (!zhangshu[2]&&zhangshu[4]==1&&zhangshu[3]>=2&&zhangshu[1]==1){
zhangshu[3]-=2;
zhangshu[4]--;
zhangshu[1]--;
num+=2;
}
//3+4>2+1 3->2+1 * 4+2*2 1
if (zhangshu[3]+zhangshu[4]>zhangshu[2]+zhangshu[1])
while (zhangshu[4]&&zhangshu[3]&&zhangshu[2]){
zhangshu[3]--;
zhangshu[4]--;
zhangshu[2]--;
zhangshu[1]++;
num++;
}
//
if (zhangshu[3]+zhangshu[4]>zhangshu[2]+zhangshu[1])
while (zhangshu[4]>=2&&zhangshu[3]>=2){
zhangshu[3]-=2;
zhangshu[4]-=2;
num+=2;
}
//3+4>2+1 3->2+1 * 4+2*1 2
if (zhangshu[3]+zhangshu[4]>zhangshu[2]+zhangshu[1])
while (zhangshu[4]&&zhangshu[3]&&zhangshu[1]){
zhangshu[1]--;
zhangshu[3]--;
zhangshu[4]--;
zhangshu[2]++;
num++;
}
//4+2*1
while (zhangshu[4]&&zhangshu[1]>1){
zhangshu[4]--;
zhangshu[1]-=2;
num++;
}
//4+2*2
while (zhangshu[4]&&zhangshu[2]>1){
zhangshu[4]--;
zhangshu[2]-=2;
num++;
}
//2->1+1 4+1+1
while (zhangshu[4]&&zhangshu[2]){
zhangshu[4]--;
zhangshu[2]--;
num++;
}
//3->1+2 * 3+1 3+2
if (zhangshu[3]%3==0&&zhangshu[1]+zhangshu[2]<=1)
while (zhangshu[3]>=3){
zhangshu[3]-=3;
num+=2;
}
//3+1
while (zhangshu[3]&&zhangshu[1]){
zhangshu[3]--;
zhangshu[1]--;
num++;
}
//3+2
while (zhangshu[3]&&zhangshu[2]){
zhangshu[3]--;
zhangshu[2]--;
num++;
}
//4->2 + 1*2 3+2 4+1*2
while (zhangshu[4]>1&&zhangshu[3]){
zhangshu[4]-=2;
zhangshu[3]--;
num+=2;
}
//4->2*2 3+2 3+2
while (zhangshu[4]&&zhangshu[3]>1){
zhangshu[4]--;
zhangshu[3]-=2;
num+=2;
}
//3->1+2 * 3+1 3+2
while (zhangshu[3]>2){
zhangshu[3]-=3;
num+=2;
}
//4->2+2 * 4+2*2
while (zhangshu[4]>1){
zhangshu[4]-=2;
num+=1;
}
if (wangzha==true&&zhangshu[1]>=2)
return num+zhangshu[1]+zhangshu[2]+zhangshu[3]+zhangshu[4]-1;
else
return num+zhangshu[1]+zhangshu[2]+zhangshu[3]+zhangshu[4];
}
int main(){
scanf("%d%d",&T,&n);
while (T--){
ans=n;
memset(pai,0,sizeof(pai));
for (int i=1;i<=n;i++){
int x,y;
scanf("%d%d",&x,&y);
if (x==1){
pai[14]++;
}
else if (x==0)
pai[1]++;
else
pai[x]++;
}
chupai(0);//出牌
printf("%d\n",ans);
return 0;
}
return 0;
} //此方法参照luogu题解

  

【Noip2015】斗地主的更多相关文章

  1. NOIP2015斗地主[DFS 贪心]

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

  2. BZOJ 4325: NOIP2015 斗地主

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

  3. NOIP2015 斗地主(搜索+剪枝)

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

  4. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  5. LOJ2422 NOIP2015 斗地主 【搜索+贪心】*

    LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...

  6. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝

    [BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...

  7. 2106. [NOIP2015] 斗地主

        2106. [NOIP2015] 斗地主 ★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比 时间限制:2 s   内存限制:1025 M ...

  8. NOIP2015斗地主题解 7.30考试

    问题 B: NOIP2015 斗地主 时间限制: 3 Sec  内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...

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

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

  10. NOIP2015斗地主(搜索+模拟+贪心)

    %%%Luan 题面就不说了,和斗地主一样,给一组牌,求最少打几次. 注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的. 枚举方法,每次搜索按照(三顺子>二顺子>普 ...

随机推荐

  1. (办公)SpringBoot和swagger2的整合.

    因为开发项目的接口需要给app,小程序测试,所以用swagger. 1.pom.xml: <dependency><!--添加Swagger依赖 --> <groupId ...

  2. 推荐一款MongoDB的客户端管理工具--nosqlbooster

    今天给大家推荐一款MongoDB的客户端工具--nosqlbooster,这个也是我工作中一直使用的连接管理MongoDB的工具.这个工具还有个曾用名--mongobooster.nosqlboost ...

  3. 解决sqlserver数据库显示单个用户

    今天突然发现数据库显示为单个用户并且,访问速度超慢,执行以下语句解决了 USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQ ...

  4. php开发微信APP支付接口

    之前在开发APP中用到了微信支付,因为是第一次用,所以中途也遇到了好多问题,通过查看文档和搜集资料,终于完成了该功能的实现.在这里简单分享一下后台php接口的开发实例. 原文地址:代码汇个人博客 ht ...

  5. Python基础——5模块

    使用模块 ‘the first line is zhushi’ _author_ = ‘syz’ import sys def test(): args = sys.argv if len(args) ...

  6. 【English】20190315

    accelerate 加速 [ækˈsɛləˌret]  Our goal is to help you be more successful in your role and work togeth ...

  7. Flink 的Window 操作(基于flink 1.3描述)

    Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的”buckets”桶,我们可以在这些桶上做计算操作.本文主要聚焦于在Flink中如何进行窗口操作,以及程序员如何 ...

  8. call()与apply()区别typeof和instanceof的区别

    摘自 http://www.cnblogs.com/qzsonline/archive/2013/03/05/2944367.html 一.方法的定义 call方法: 语法:call(thisObj, ...

  9. Java线程锁,synchronized、wait、notify详解

    (原) JAVA多线程这一块有点绕,特别是对于锁,对锁机制理解不清的话,程序出现了问题也很难找到原因,在此记录一下线程的执行以及各种锁. 1.JAVA中,每个对象有且只有一把锁(lock),也叫监视器 ...

  10. Linux-基础学习(三)-Nginx学习

    1.nginx安装与部署 1.1 nginx入门 Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的 请求后才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP( ...