BZOJ3324 : [Scoi2013]火柴棍数字
为了使数字最大,首先要最大化其位数。
设$f[i][j][k]$表示从低到高考虑了$i$位,手头火柴棍个数为$j$,第$i$位是不是$0$时,最少移动多少根火柴。
若$f[i][0][非0]\leq k$,则存在一个长度为$i$的数,由此可以求出最大长度。
确定长度之后,再从高到低逐位贪心确定每一位即可。
时间复杂度$O(nk)$。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3510;
int n,m,all,use,len,i,j,k,x;char a[N];
short f[N/2][N*2][2];
int S[10]={126,48,107,121,53,93,95,112,127,125},dx[11][10],dy[11][10];
inline void up(short&x,short y){if(x>y)x=y;}
int main(){
for(i=0;i<10;i++)for(j=0;j<10;j++)for(k=0;k<7;k++){
if(!(S[i]>>k&1)&&(S[j]>>k&1))dx[i][j]++,dy[i][j]++;
if((S[i]>>k&1)&&!(S[j]>>k&1))dx[i][j]--;
}
for(i=0;i<10;i++)for(k=0;k<7;k++)if(S[i]>>k&1)dx[10][i]++,dy[10][i]++;
scanf("%s%d",a+1,&m);
n=strlen(a+1);
reverse(a+1,a+n+1);
for(i=1;i<=n;i++)a[i]-='0';
for(i=1;i<=n;i++)all+=dy[10][a[i]];
len=all/2;
for(i=n+1;i<=len;i++)a[i]=10;
for(i=0;i<=len;i++)for(j=-m;j<=m;j++)for(k=0;k<2;k++)f[i][j+N][k]=m+1;
f[0][N][0]=0;
for(i=0;i<len;i++)for(j=-m;j<=m;j++)for(k=0;k<2;k++)if(f[i][j+N][k]<=m)
for(x=0;x<10;x++){
up(f[i+1][j+N+dx[a[i+1]][x]][x==0],f[i][j+N][k]+dy[a[i+1]][x]);
}
while(f[len][N][0]>m)len--;
for(i=0;i<=len;i++)for(j=-m;j<=m;j++)up(f[i][j+N][0],f[i][j+N][1]);
for(all=0,i=len;i;i--)for(j=9;~j;j--){
all+=dx[a[i]][j],use+=dy[a[i]][j];
if(f[i-1][N-all][0]<=m-use){printf("%d",j);break;}
all-=dx[a[i]][j],use-=dy[a[i]][j];
}
return 0;
}
BZOJ3324 : [Scoi2013]火柴棍数字的更多相关文章
- [SCOI2013]火柴棍数字(背包)
题目 做饭 由于越高位越好,我们先得出能组成的最高位 \(f[i][j][k]\)表示从低到高位第\(i\)位,手里拿着\(j\)根火柴,第\(i\)位是否为\(0\)所需要的最少火柴 我们转移仅需得 ...
- [Swust OJ 179]--火柴棍(找规律)
题目链接:http://acm.swust.edu.cn/problem/0179/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- [LeetCode] Matchsticks to Square 火柴棍组成正方形
Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NOIP200806 火柴棒等式【B005】
[B005]火柴棒等式[难度B]———————————————————————————————————————————————————————————— [题目要求] 给你n根火柴棍,你可以拼出多少个 ...
- NOIP2008提高组火柴棒等式(模拟)——yhx
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...
- TYVJ P1012 火柴棒等式 Label:枚举
背景 NOIP2008年提高组第二题 描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法 ...
- noip2008 火柴棒等式
P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 给你n根火柴棍,你可以拼出多 ...
- 洛谷-火柴棒等式-NOIP2008提高组复赛
题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: ...
随机推荐
- 使用asp.net MVC的 HtmlHelper 时遇到的小问题,报错:Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
异常信息:Templates can be used only with field access, property access, single-dimension array index, or ...
- 插件使用一表单验证一validation
jquery-validation是一款前端经验js插件,可以验证必填字段.邮件.URL.数字范围等,在表单中应用非常广泛. 官方网站 https://jqueryvalidation.org/ 源码 ...
- C# 位移运算
一:“<<”和“>>”运算符用于执行移位运算,分别称为左移位运算符和右移位运算符.对于X<<N和X>>N形式的运算,含义是将X向左或向右移动N位,得到的 ...
- 一脸懵逼学习Struts数据校验以及数据回显,模型驱动,防止表单重复提交的应用。
1:Struts2表单数据校验: (1)前台校验,也称之为客户端校验,主要是通过Javascript编程的方式进行数据的验证. (2)后台校验,也称之为服务器校验,这里指的是使用Struts2通过xm ...
- es6 模板字符串
模板字符串 提供构造字符串的语法糖,在 Prel/python 等语言中也都有类似特性. 1.反引号模板,可以换行 2.反引号模板,可以嵌套 用+``来嵌套 好处:语法更加简洁 var name=&q ...
- 内存栈与堆的区别C#
C# 堆与栈 理解堆与栈对于理解.NET中的内存管理.垃圾回收.错误和异常.调试与日志有很大的帮助.垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存, ...
- mysql binary
mysql在比较字符串的时候是忽略大些写的 比如有用户叫ABC和abc select * from `sys_user` where username = 'abc' 会出来两条记录 select * ...
- Python 命令模式和交互模式
命令模式 在系统CMD命名模式下执行 命令执行到脚本所在目录 执行python Test.py 可直接一次执行完脚本里面所有的语句 交互模式下 一行一行执行
- Asp.net MVC - 使用PRG模式(附源码)
阅读目录: 一. 传统的Asp.net页面问题 二.Asp.net MVC中也存在同样的问题 三.使用PRG模式 四.PRG模式在MVC上的实现 一. 传统的Asp.net页面问题 一个传统的Asp. ...
- vue 中如何对公共css、 js 方法进行单文件统一管理,全局调用
1.前言 最近,为公司开发交付的一个后台管理系统项目,我使用了 Vue 框架进行开发实践. 模块化.组件化.工程化的开发体验非常好.良好的 api,优雅的设计,对于工程师非常友好. 但是由于模块比较多 ...