Description

 序列A由从N开始的连续K个数按顺序构成,现在将A中的每个数只保留某一个数码,记为序列B,给定K和B,求可能的最小的N

Input

第一行一个数K,第二行K个数B_i

Output

输出一个数N

当确定了N的个位时,可以确定这连续的K个数的个位,这是得到子问题求N/10的值,B数组(压位表示子问题中哪些位必须出现)对应更新为大约K/10的长度,于是可以递归处理,当K=1时贪心确定所需的最高位

当K=2时若选择个位为9则递归下去K仍为2,要特判剪枝一下

递归到K=1时,若答案有必须存在的前导0则要特判在前面补位

#include<cstdio>
typedef long long i64;
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
int n,v[],d[];
i64 dfs(int*d0,int n,bool _9,bool _0){
bool dd=;
for(int i=;i<n;++i)if(d0[i]){dd=;break;}
if(!dd)return _0;
if(n==){
int x=*d0;
if(x==)x=;
i64 v=;
for(int i=;i<;++i)if(x>>i&){
v=i;
x^=<<i;
break;
}
for(int i=;i<;++i)if(x>>i&)v=v*+i;
return v;
}
i64 v0=1ll<<;
int*d1=d0+n;
for(int a=;a<;++a){
if(a==&&!_9)break;
int n1=,x=a,s=;
for(int b=;b<n;++b){
s|=d0[b]&~(<<x);
if(++x==){
x=;
d1[n1++]=s;
s=;
}
}
if(x)d1[n1++]=s;
i64 v1=dfs(d1,n1,a!=||n>,!a&&(_0||(&*d0)))*+a;
if(v1<v0)v0=v1;
}
return v0;
}
int main(){
n=_();
for(int i=;i<n;++i)d[i]=<<(v[i]=_());
printf("%lld",dfs(d,n,,));
return ;
}

最新文章

  1. http状态代码-转载
  2. DeviceFamily XAML Views(一)
  3. 对&quot;构建之法“的理解和困惑
  4. 转:SSL协议详解
  5. python 基础——实现一个带缓存功能的函数
  6. Oracle 隔离级别
  7. POJ 1017 Packets
  8. BZOJ1709: [Usaco2007 Oct]Super Paintball超级弹珠
  9. firefox的window.onerror没有详细的出错提示
  10. Linux系统操作指令汇总
  11. Docker_快速部署jenkins
  12. WordPress用键盘左右方向键来查看上一篇和下一篇文章
  13. 【C语言】位运算
  14. 牛客网 272B Xor Path(树上操作)
  15. SpringMvc通过@Value( ) 给静态变量注入值
  16. SQL Server如何查看当前数据库连接的SPID
  17. 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题
  18. Python 函数(二)
  19. grandstack graphql 开发模型
  20. oracle triggers 实现两个结构相同的表的数据级联更新操作

热门文章

  1. Neutron Metering as a Service
  2. Munin监控的安装与配置
  3. Python科学画图小结
  4. Android--解析XML之SAX
  5. 【P1304】【P1305】选课与选课输出方案
  6. LESS中文版函数手册
  7. java的nio之:java的nio系列教程之channel的数据交换
  8. 【转】详解使用tcpdump、wireshark对Android应用程序进行抓包并分析
  9. SPL迭代器的工作和代理模式OuterIterator
  10. QQ登入(1)-有客户端直接授权,没客户端web授权