斗地主(NOIP2015)
神奇的题目。。
一开始我准备打暴力直接搜答案。
然后发现。。
无限TLE。。
因为O((logN)^14*T)BOOM。。
然后Zxyer告诉可以只DFS顺子。。。其他的可以一步搞出来。。
然后就0ms了!
Orz zxyer
下面贴代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
int pai[];
int s[];
int ans=inf,n,t,x;
int cal(){
s[]=s[]=s[]=s[]=;
int ans1=;
for (register int i=;i<=;i++)s[pai[i]]++;
if(pai[]&&pai[])ans1++,s[]-=;
while(s[]&&s[]>)ans1++,s[]--,s[]-=;
while(s[]&&s[]>)ans1++,s[]--,s[]-=;
while(s[]&&s[])ans1++,s[]--,s[]--;
while(s[]&&s[])ans1++,s[]--,s[]--;
return ans1+s[]+s[]+s[]+s[];
}
void dfs(int q){
if(q>=ans)return;
ans=min(ans,q+cal());
register int j;
for(register int i=;i<=;i++)
{
j=i;
while((j<)&&(pai[j]>=)){pai[j++]-=;
if(j-i>)dfs(q+);}
while(j-i)pai[--j]+=;
}
for(register int i=;i<=;i++)
{
j=i;
while((j<)&&(pai[j]>=)){pai[j++]-=;
if(j-i>)dfs(q+);
}
while(j-i)pai[--j]+=;
}
for(register int i=;i<=;i++)
{
j=i;
while((j<)&&(pai[j])){--pai[j++];
if(j-i>)dfs(q+);}
while(j-i)++pai[--j];
}
}
int getnum(int q){
int y;
scanf("%d",&y);
if(!x)return y+;
if(x<)return x+;
return x-;
}
int main(){
scanf("%d",&t);scanf("%d",&n);
for(int i=;i<=t;i++)
{
memset(pai,,sizeof(pai));
ans=inf;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
pai[getnum(x)]++;
}
dfs();
printf("%d\n",ans);
}
return ;
}
斗地主(NOIP2015)的更多相关文章
- 斗地主 (NOIP2015 Day1 T3)
斗地主 张牌,因为它可以连在K后, 总体思路为 先出炸弹和四带二 再出三带一 再把对牌和单牌出完 记录并更新Answer,后枚举顺子,并继续向下搜索. 注意:弄明白题意,题目描述不太清楚....另外, ...
- 斗地主[NOIP2015]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 洛谷P2668 斗地主 [NOIP2015]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- NOIP2015斗地主[DFS 贪心]
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[Submit][Status] ...
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- [补档][NOIP2015] 斗地主
[NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ...
- 2106. [NOIP2015] 斗地主
2106. [NOIP2015] 斗地主 ★★★☆ 输入文件:landlords.in 输出文件:landlords.out 简单对比 时间限制:2 s 内存限制:1025 M ...
随机推荐
- python爬虫:爬取猫眼TOP100榜的100部高分经典电影
1.问题描述: 爬取猫眼TOP100榜的100部高分经典电影,并将数据存储到CSV文件中 2.思路分析: (1)目标网址:http://maoyan.com/board/4 (2)代码结构: (3) ...
- Python必学:使用哪款文本编辑器更好?
Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样,程 ...
- 快速排序算法Java实现
1) 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行 示例: package ...
- C# 创建新线程
首先需要包含命名空间 using System.Threading; 然后创建进程 Thread th = new Thread(new ThreadStart(ThreadMethod)); //创 ...
- 用go run命令启动main package中的多个文件
linux: go run *.go windows: go build后运行main.exe
- 20145202马超 《Java程序设计》第九周学习总结
JDBC 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找. JDBC(Java DataBase Connectivity)是Java联机数据库 ...
- Kali2017 Metasploit连接postgresql数据库
msfdb:msf数据库管理命令 1.查看msf数据库连接状态 msf > db_status [*] postgresql selected, no connection //未连接 2.ms ...
- 程序第一次启动推送跳转,handleOpenURL没法跳转的原因
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有 ...
- React + webpack 快速搭建开发环境
因网上大多React + webpack快速搭建的运行不起来,便自行写了一个.在搭建开发环境的前需安装nodejs,npm. 新建一个工作目录,比如叫reactdome,在reactdome目录中运行 ...
- 《Cracking the Coding Interview》——第3章:栈和队列——题目6
2014-03-19 03:01 题目:给定一个栈,设计一个算法,在只使用栈操作的情况下将其排序.你可以额外用一个栈.排序完成后,最大元素在栈顶. 解法:我在草稿纸上试了试{1,4,2,3}之类的小例 ...