题目

#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. Fragment与Activity的生命周期对比

    因为fragment是依赖于activity的,所以activity的创建相关都是先于fragment的,fragment的销毁相关都是先于activity的.

  2. idea连接服务器上传jar并运行

    .打开idea tools-deployment-configuration..                                   .打开如图 点击 + 号           .如 ...

  3. 关于sqlserver字符类型查询条件区分大小写

    在写sql的查询时 如下: select * from Users where username='WangE' select * from Users where username='wange' ...

  4. jQuery 中的简单动画

    制作动画常用方法: show("速度")   显示元素   hide("速度")   隐藏元素   toggle()       切换效果 例如下jQuery代 ...

  5. SQLServer之修改CHECK约束

    使用SSMS数据库管理工具修改CHECK约束 1.打开数据库,选择数据表->右键点击->选择设计(或者展开约束,选择约束,右键点击,选择修改,后面步骤相同). 2.选择要修改的数据列-&g ...

  6. spark读写hbase性能对比

    一.spark写入hbase hbase client以put方式封装数据,并支持逐条或批量插入.spark中内置saveAsHadoopDataset和saveAsNewAPIHadoopDatas ...

  7. Go语言中定时器cron的基本使用

    安装:go get github.com/robfig/cron  如果出不去就用gopm 例子: package main import ( "fmt" "github ...

  8. jmeter(二十五)linux环境运行jmeter并生成报告

    jmeter是一个java开发的利用多线程原理来模拟并发进行性能测试的工具,一般来说,GUI模式只用于创建脚本以及用来debug,执行测试时建议使用非GUI模式运行. 这篇博客,介绍下在linux环境 ...

  9. PHP中feof()函数的猜测

    本文环境: OS:Mac OS X 10.8.4 PHP:5.3.15 PHP的官方手册中,函数feof()下面的讨论不少,对此做了一些相关的测试. <?php print <<&l ...

  10. python批量修改linux主机密码

    +++++++++++++++++++++++++++++++++++++++++++标题:python批量修改Linux服务器密码时间:2019年2月24日内容:基于python实现批量修改linu ...