【CS Round #39 (Div. 2 only) D】Seven-segment Display
【Link】:https://csacademy.com/contest/round-39/task/seven-segment-display/
【Description】
0..9各自有一个数字,代表组成它需要几根棍子;
给你k根棍子,然后问你这k根棍子能够组成的最小数字是多少;
【Solution】
数位DP;
设b[0..9]表示对应下标的数码要多少根棍子组成;
设f[i]表示i根棍子能否组成一个数字,如果能的话,组成的数字最小是由几个数码组成的;
(为INF表示不能组成);
f[0] = 0;
然后对于f[i];
f[i+b[0..9]] = min(f[i+b[0..9]],f[i]+1);
表示把0或1或..9放在原先组成的数后面;
O(N∗10)的递推就能弄出f数组;
然后对于f[k];
先判断f[k]是否为INF;
不是INF;
则能够确定最后答案的位数了;
如果f[k]==1;
则第一位可以为0;
否则,第一位不能为0;
因为0和6的棍子个数是一样的;
所以不用担心全是0(且f[k]>1的情况),因为那样的话,我们最少会,把第一个数填成一个6;
枚举完第一位之后,剩下的都可以从0开始枚举了;
依次确定每一位即可;
【NumberOf WA】
2
【Reviw】
漏掉了单独一个0的情况了;
没能及时想到状态.
【Code】
/*
f[i]表示i根棍子能不能组成若干个数字;
f[b[0..9]] = 1;
if (f[i])
dfs(i);
dfs(int x)
{
f[x] = ..
dfs(x+b[0..9]);
}
每个物品可以无限拿,容量为k;
先取棍子多的数字不一定对.
可能另外一个棍子小;
但是两个棍子同样组成了k,但是
f[i]i根棍子可否组成一个数字,可以的话最少几个数字;
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
// 0 1 2 3 4 5 6 7 8 9
const int b[] = {6,2,5,5,4,5,6,3,7,6};
const int c[] = {8,0,6, 9, 2, 3, 5 ,4 ,7 ,1};
const int INF = 0x3f3f3f3f;
//8 0 6 9 2 3 5 4 7 1
const int N = 1e5;
int f[N+10],a[N+10],len;
int k;
map <int,bool> dic[N+5];
void dfs(int now,int rest){
if (rest==0) return;
for (int j = 0;j <= 9;j++)
if (rest>=b[j] && f[rest-b[j]] == (f[rest]-1)){
len++;
a[now] = j;
dfs(now+1,rest-b[j]);
return;
}
}
main(){
memset(f,INF,sizeof f);
f[0] = 0;
for (int i = 0;i <= N;i++)
if (f[i]<=INF){
for (int j = 0;j <= 9;j++){
int t = i+b[j];
if (t>N) continue;
f[t] = min(f[t],f[i]+1);
}
}
scanf("%lld",&k);
if (f[k]>=INF){
puts("-1");
}else{
if (f[k]==1 && k==b[0]){
puts("0");
return 0;
}
for (int j = 1;j <= 9;j++)
{
if (k-b[j]>=0 && f[k-b[j]] == (f[k]-1)){
len = 1;
a[len] = j;
dfs(2,k-b[j]);
for (int i = 1;i <= len;i++)
printf("%lld",a[i]);
return 0;
}
}
puts("-1");//因为不存在全为0的情况,所以可以去掉这句
}
return 0;
}
【CS Round #39 (Div. 2 only) D】Seven-segment Display的更多相关文章
- 【CS Round #39 (Div. 2 only) C】Reconstruct Sum
[Link]:https://csacademy.com/contest/round-39/task/reconstruct-sum/ [Description] 给你一个数字S; 让你找有多少对A, ...
- 【CS Round #39 (Div. 2 only) B】Circle Elimination
[Link]:https://csacademy.com/contest/round-39/task/circle-elimination/ [Description] [Solution] 把n个点 ...
- 【CS Round #39 (Div. 2 only) A】Removed Pages
[Link]: [Description] [Solution] 每读入一个x; 把a[(x-1)/2]置为1即可; 统计1的个数 [NumberOf WA] [Reviw] [Code] /* */ ...
- 【CS Round #36 (Div. 2 only) A】Bicycle Rental
[题目链接]:https://csacademy.com/contest/round-36/task/bicycle-rental/ [题意] 让你从n辆车中选一辆车; 每一辆车有3个属性 1.到达车 ...
- 【CS Round #37 (Div. 2 only) D】Reconstruct Graph
[Link]:https://csacademy.com/contest/round-37/task/reconstruct-graph/statement/ [Description] 给你一张图; ...
- 【CS Round #37 (Div. 2 only) B】Group Split
[Link]:https://csacademy.com/contest/round-37/task/group-split/ [Description] 让你把一个数分成两个数a.b的和; (a,b ...
- 【CS Round #37 (Div. 2 only) A】Boring Number
[Link]:https://csacademy.com/contest/round-37/task/boring-number/ [Description] 让你找离平均数最近的一个数的下标; [S ...
- 【CS Round #46 (Div. 1.5) E】Ultimate Orbs
[链接]链接 [题意] n个人从左到右站在一条直线上.每个人都有一个能力值g[i],然后每个人可以将相邻的一个人打败. 然后它的能力值能够增加相应的能力值(就是打败了的那个人的能力值). A能够打败B ...
- 【CS Round #46 (Div. 1.5) C】Set Subtraction
[链接]h在这里写链接 [题意] 一开始有n个数字,然后有一个数字X,把每个数字都减去X,又生成N个新的数字. 然后把这2*N个数字混在一起. 告诉你这2*N个数字是什么.让你复原出原来的N个数字,以 ...
随机推荐
- jQuery实现tab标签切换效果
技巧一.jQuery :eq() 选择器 定义和用法 :eq() 选择器选取带有指定 index 值的元素. index 值从 0 开始,所有第一个元素的 index 值是 0(不是 1). 经常与其 ...
- 列表的所有的input,将它的值以键值对的形式存放到一个数组里
要求的格式 代码块 $('.btn-confirm').on('tap',function(){ var arr={}; var name = $("input[name='insuranc ...
- 【Git 一】Linux安装Git
一.Git 的优势 #简单说一下 Git 的优势. 1.版本库本地化,支持离线提交,相对独立不影响协同开发. 2.支持快速切换分支方便合并,比较合并性能好. 3.分布式管理,适应不同的业务场景. 4. ...
- bzoj1090 字符串折叠
问题描述 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S S 2. X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) SSSS…S(X个S). 3. 如果A ...
- [Bug]Python3.x SyntaxError: 'ascii' codec can't decode byte 0xe4 in position
安装arch后就没再用python了 昨天管服务器的大佬在跑贝叶斯分类器的时候发现正确率有问题 我赶紧去做优化,然后就有这样的报错 Python 3.6.4 (default, Jan 5 2018, ...
- 紫书 习题 10-10 UVa 1645(递推)
除了根节点以外,有n-1个节点,然后就看n-1的因数有那些,所有因数加起来(递推)就好了. #include<cstdio> #define REP(i, a, b) for(int i ...
- 查看mysql正在执行的SQL语句,使用profile分析SQL执行状态
http://qq85609655.iteye.com/blog/2113960 1)我们先通过status命令查看Mysql运行状态 mysql> status; -------------- ...
- vmware下ubuntu的网络配置
捣弄了vmnet0和vmnet8连接后,ubuntu上不了网了,今天突然解决了这个问题. 打开vmware后,点编辑-->虚拟网络编辑器 这里我使用的是NAT模式,所以要修改vmnet8 点vm ...
- Python使用Redis实现一个简单作业调度系统
Python使用Redis实现一个简单作业调度系统 概述 Redis作为内存数据库的一个典型代表,已经在非常多应用场景中被使用,这里仅就Redis的pub/sub功能来说说如何通过此功能来实现一个简单 ...
- 配置mac机svn服务器
这几天一直纠结如何配置mac机svn服务器,在网上查了很多资料,无奈本人底子太差,菜鸟级别,理解能力有限,照网上的总是配置不好,最后无奈问了刘超老师,终于配置成功.现在写一下具体配置过程,菜鸟级别可以 ...