题目

#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. c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...

  2. wxPython树控件

    1.树控件 树(tree)是一种通过层次结构展示信息的控件,如下图所示是树控件示例,左窗口中是树控件,在wxPython中树控件类是wx.TreeCtrl. wx.TreeCtrl中一个常用的方法有: ...

  3. oc中的委托模式

    通过一个例子来理解委托模式 首先定义个协议 协议(protocol) :它可以声明一些必须实现的方法和选择实现的方法  (在java中称为接口) // // StudentDelegate.h // ...

  4. Redis学习笔记(5)——Redis数据持久化

    出处http://www.cnblogs.com/xiaoxi/p/7065328.html 一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存 ...

  5. HBase Client JAVA API

    旧 的 HBase 接口逻辑与传统 JDBC 方式很不相同,新的接口与传统 JDBC 的逻辑更加相像,具有更加清晰的 Connection 管理方式. 同时,在旧的接口中,客户端何时将 Put 写到服 ...

  6. MAC oh-my-zsh

    效果图 step1 : 安装zsh    brew install zsh step2: sudo vim  /etc/shells 添加 /usr/local/bin/zsh  step3:安装oh ...

  7. springboot在eclipse中运行使用开发配置,打包后运行使用生产环境默认配置

    java命令运行springboot jar文件,指定配置文件可使用如下两个参数中其中一个 --spring.config.location=配置文件路径 -Dspring.profiles.acti ...

  8. ORM相关操作

    1.一般操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs) ...

  9. 20175229许钰玮 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175229许钰玮 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 自动生成四则运算题目(加.减.乘.除). 既可以用前缀算法(波兰算法 ...

  10. MicroPython实例之TPYBoard开发板控制OLED显示中文

    0x00 前言 之前看到一篇文章是关于TPYBoard v102控制OLED屏显示的,看到之后就想尝试一下使用OLED屏来显示中文.最近利用空余时间搞定了这个实验,特此将实验过程及源码分享出来,方便以 ...