洛谷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;
}
随机推荐
- ImportError: DLL load failed: 找不到指定的模块。
这里用的anacoda,报错是找不到DLL,可能是该DLL的环境变量没配置,配置系统环境变量: 重启一下pycharm,OK.
- 关于php,python,javascript文件或者模块导入引入的区别和联系
前言: 我们经常看到编程语言之间,文件或者模块的引来引去的,但是他们在各个编程语言之间有什么区别和联系呢? 1.javascript (1).全局引入方式: <script src='xxxxx ...
- pandas数据清洗策略1
Pandas常用的数据清洗5大策略如下: 1.删除 DataFrame 中的不必要 columns 2.改变 DataFrame 的 index 3.使用 .str() 方法来清洗 columns 4 ...
- 泛函p121可分Hilbert空间都同构于l^2
如何理解最后面两句话, L^2与l^2同构 L^2里面 有理系数多项式 是可数稠密子集 所以L^2可分 可分Hilbert空间都同构于 l^2 傅里叶级数是一个稠密的子集
- Python之json使用
一.概念 json是一种通用的数据类型,任何语言都认识 接口返回的数据类型都是json 长得像字典,形式也是k-v { } 其实json是字符串 字符串不能用key.value来取值,要先转成字典才可 ...
- 我的第一个Go web程序 纪念一下
参考Go web编程,很简单的程序: 大致的步骤: 绑定ip和端口 绑定对应的处理器或者处理器函数,有下面两种选择,选择一种即可监听ip及端口 处理器: 定义一个struct结构体 然后让这个结构体实 ...
- 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序
题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...
- 微信小程序登录授权并获取手机号
一.请求发送 携带 code 到后台换取 openid var that = this; wx.login({ success(res) { console.log(res); var code = ...
- 九、.net core用orm继承DbContext(数据库上下文)方式操作数据库
一.创建一个DataContext普通类继承DbContext 安装程序集:Pomelo.EntityFrameworkCore.MySql 二.配置连接字符串(MySql/SqlServer都 ...
- webpack配置之代码优化
前面的话 前面介绍了webpack的基本配置,本文将详细介绍webpack中关于代码优化的配置 打包公共代码 CommonsChunkPlugin 插件,是一个可选的用于建立一个独立文件(又称作 ch ...