洛谷P4907【CYH-01】小奔的国庆练习赛 :$A$换$B$ $problem$(DFS,剪枝)
顺便提一下题意有一个地方不太清楚,就是如果输出No
还要输出最少需要添加多少张牌才能满足要求。蒟蒻考完以后发现四个点Too short on line 2
。。。
比较需要技巧的搜索
既然是同一个花色要连续,那就枚举每一个花色在哪一段区间连续并选中四个区间,累计每个点数的选中次数。
最后来一个\(O(13)\)的\(\text{check}\),首先每个点数选中次数要不少于已有的个数。接着,只有所有点数的选中次数和已有点数相等时,才能判为'Yes',然后统计某张牌的花色的区间未包含这张牌的总数更新答案。否则判为'No',然后统计每个点数选多了的总数更新答案。
总复杂度\(\binom{13}{2}^4* 13=481195728\),超过了\(10^8\),肯定需要剪枝。
可行性剪枝:每个点数选中次数之和不少于原有牌的总数。
最优性剪枝:实时统计选多了的总数,在No
的状态下,如果超过答案则剪掉;在Yes
的状态下,只要不为\(0\)就剪掉。
700+ms比标程快多了。可能标程比较良心没加什么剪枝。
#include<bits/stdc++.h>
#define R register int
using namespace std;
const int N=99;
int a[N],b[N],l[N],r[N],cnt[N],n,now1,ans=N,ans1=N;
char s[N];
void dfs(R h,R lef){//lef为n-当前已选中总次数
if(h==5){
R now=0;
for(R i=1;i<=13;++i){
if(cnt[i]>0)return;//不合法
now|=cnt[i]<0;
}
if(now){ans1=now1;return;}//No状态
for(R i=1;i<=n;++i)//Yes状态,统计答案
if((l[a[i]]>b[i]||r[a[i]]<b[i])&&++now==ans)return;
ans=now;ans1=1;return;//注意ans1=1的剪枝作用
}
for(R i=max(lef-(4-h)*13,0),j,rr;i<=13;++i){//枚举区间长度,可行性剪枝
if(i==0){l[h]=r[h]=0;dfs(h+1,lef);continue;}
for(rr=i;rr<=13;++rr){//枚举右端点
for(j=rr-i+1;j<=rr;++j)now1+=--cnt[j]<0;//动态维护当前选多了的总数
if(now1<ans1)l[h]=(r[h]=rr)-i+1,dfs(h+1,lef-i);//最优性剪枝
for(j=rr-i+1;j<=rr;++j)now1-=++cnt[j]<=0;
}
}
}
int main(){
scanf("%d",&n);
for(R i=1;i<=n;++i){
scanf("%d%s",&a[i],s);
if(s[0]=='A')b[i]=1;//把点数处理一下
else if(s[0]=='1')b[i]=10;
else if(s[0]=='J')b[i]=11;
else if(s[0]=='Q')b[i]=12;
else if(s[0]=='K')b[i]=13;
else b[i]=s[0]-'0';
++cnt[b[i]];
}
dfs(1,n);
if(ans!=N)printf("Yes\n%d\n",ans);
else printf("No\n%d\n",ans1);
return 0;
}
随机推荐
- JS典记
var href = ""; //遍历a标签 $ ( "a"). each (function () { href = ...
- 后台管理系统之邮件开发(Java实现)
一,功能点 后台管理系统,添加用户时.对注册的新用户邮箱发送初始密码. 二,代码实现 1.Mail实体类 public class Mail { private Set<String> r ...
- 学习memcache
本文参考了菜鸟教程中的内容. 安装 安装memcache的时候,请切换为root用户 root@centos # wget http://www.memcached.org/files/memcach ...
- scroll滚动条样式修改
一般我们有两种情况会出现滚动条,一种是overflow,一种是使用scroll. 当我们需要改变这个滚动条样式的时候,我们需要做以下的修改: html: <div id="style- ...
- HTTL之初印象
概述 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. 简洁 ...
- js中获取当前项目名等
实际上通过window.location可以获取很多跟资源路径相关的信息,需要用到的时候直接通过浏览器调试可以查看window.location的一些属性
- WPF 如何创建自己的WPF自定义控件库
在我们平时的项目中,我们经常需要一套自己的自定义控件库,这个特别是在Prism这种框架下面进行开发的时候,每个人都使用一套统一的控件,这样才不会每个人由于界面不统一而造成的整个软件系统千差万别,所以我 ...
- 关于mysql远程登录问题
问题:mysql不能实现远程登录 前提:mysql开启了远程登录账号,安全组也放行了3306,防火墙是iptables,也加入了3306放行,但是还是不能实现远程访问 解决办法,使用iptables ...
- 老男孩python学习自修第十一天【内置函数】
1.基本内置函数 help() 帮助文档 dir() 列出当前文件的所有变量和方法 vars() 列出当前文件的所有变量及其值 type() 返回变量的类型 id() 返回变量的内存地址 len() ...
- Mybatis之执行自定义SQL举例
本文说明如何使用Mybatis执行我自定义输入的SQL语句. 需要的mybaits文件包括:配置文件(mybatis-config-dao.xml 和 jdbc.properties).接口文件(IS ...