洛谷题目传送门

顺便提一下题意有一个地方不太清楚,就是如果输出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;
}

随机推荐

  1. iOS NSDictionary JSON 相互转换

    /*! * @brief 把格式化的JSON格式的字符串转换成字典 * @param jsonString JSON格式的字符串 * @return 返回字典 */ + (NSDictionary * ...

  2. 搭建私服-docker registry

    Docke官方提供了Docker Hub网站来作为一个公开的集中仓库.然而,本地访问Docker Hub速度往往很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用.Docker仓库实际上提供两方 ...

  3. Mysql drop function xxxx ERROR 1305 (42000): FUNCTION (UDF) xxxx does not exist

    mysql> drop function GetEmployeeInformationByID;ERROR 1305 (42000): FUNCTION (UDF) GetEmployeeInf ...

  4. Linux查看和注销用户(User)

    Linux如何注销其他用户?_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2012-07/64939.htm linux注销指定 ...

  5. 【Python3练习题 010】将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

    #参考http://www.cnblogs.com/iderek/p/5959318.html n = num = int(input('请输入一个数字:'))  #用num保留初始值 f = []  ...

  6. spring aop学习记录

    许多AOP框架,比较常用的是Spring AOP 与AspectJ.这里主要学习的Spring AOP. 关于AOP 日志.事务.安全验证这些通用的.散步在系统各处的需要在实现业务逻辑时关注的事情称为 ...

  7. connect、resource和dba三种标准角色

    授权语句:grant connect,resource,dba to zwserver 经过授权以后,用户拥有connect.resource和dba三个角色的权限: (1)Connect 角色,是授 ...

  8. 生命周期函数以及vue的全局注册

    beforeCreate 在创造实例之前 created 创造实例以后 beforeMount 在挂载前 render 渲染节点到页面上 //将虚拟dom数组渲染出来 mounted 挂载以后 bef ...

  9. Azure系列2.1.14 —— CopyState

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  10. git客户端下载 和安装

    网址  https://git-scm.com/download/win 点击next 说明: (1)图标组件(Addition icons) : 选择是否创建桌面快捷方式. (2)桌面浏览(Wind ...