【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的更多相关文章

  1. 【CS Round #39 (Div. 2 only) C】Reconstruct Sum

    [Link]:https://csacademy.com/contest/round-39/task/reconstruct-sum/ [Description] 给你一个数字S; 让你找有多少对A, ...

  2. 【CS Round #39 (Div. 2 only) B】Circle Elimination

    [Link]:https://csacademy.com/contest/round-39/task/circle-elimination/ [Description] [Solution] 把n个点 ...

  3. 【CS Round #39 (Div. 2 only) A】Removed Pages

    [Link]: [Description] [Solution] 每读入一个x; 把a[(x-1)/2]置为1即可; 统计1的个数 [NumberOf WA] [Reviw] [Code] /* */ ...

  4. 【CS Round #36 (Div. 2 only) A】Bicycle Rental

    [题目链接]:https://csacademy.com/contest/round-36/task/bicycle-rental/ [题意] 让你从n辆车中选一辆车; 每一辆车有3个属性 1.到达车 ...

  5. 【CS Round #37 (Div. 2 only) D】Reconstruct Graph

    [Link]:https://csacademy.com/contest/round-37/task/reconstruct-graph/statement/ [Description] 给你一张图; ...

  6. 【CS Round #37 (Div. 2 only) B】Group Split

    [Link]:https://csacademy.com/contest/round-37/task/group-split/ [Description] 让你把一个数分成两个数a.b的和; (a,b ...

  7. 【CS Round #37 (Div. 2 only) A】Boring Number

    [Link]:https://csacademy.com/contest/round-37/task/boring-number/ [Description] 让你找离平均数最近的一个数的下标; [S ...

  8. 【CS Round #46 (Div. 1.5) E】Ultimate Orbs

    [链接]链接 [题意] n个人从左到右站在一条直线上.每个人都有一个能力值g[i],然后每个人可以将相邻的一个人打败. 然后它的能力值能够增加相应的能力值(就是打败了的那个人的能力值). A能够打败B ...

  9. 【CS Round #46 (Div. 1.5) C】Set Subtraction

    [链接]h在这里写链接 [题意] 一开始有n个数字,然后有一个数字X,把每个数字都减去X,又生成N个新的数字. 然后把这2*N个数字混在一起. 告诉你这2*N个数字是什么.让你复原出原来的N个数字,以 ...

随机推荐

  1. linux上将另一个文件内容快速写入正在编辑的文件内

    一.我们看到 www 目录下有两个文件.like.php 内有一行字母,而 loo.php 内什么也没有. 二 .我们来编辑 loo.php. 三.用下面的命令将 like.php 的内容复制到 lo ...

  2. 移动端viewport解惑

    我们在做移动端webapp的时候需要设置这么一段: <meta name="viewport" content="width=device-width, initi ...

  3. 紫书 例题 10-20 UVa 10900(连续概率)

    分两类,当前第i题答或不答 如果不回答的话最大期望奖金为2的i次方 如果回答的话等于p* 下一道题的最大期望奖金 那么显然我们要取最大值 所以就要分类讨论 我们设答对i题后的最大期望奖金为d[i] 显 ...

  4. 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引

    先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库,而且这几个项目的表是完全一样的. 数据库表的特点 ...

  5. Vue代理&跨域

    Vue 本地代理 纯前端技术解决跨域 vue-axios获取数据很多小伙伴都会使用,但如果前后端分离且后台没设置跨域许可,那要怎样才能解决跨域问题? 常用方法有几种: 通过jsonp跨域 通过修改do ...

  6. 云服务器 ECS Linux 系统下使用 dig 命令查询域名解析

    云服务器 ECS Linux 系统可以使用通常自带的 dig 命令来查询域名解析情况.本文对此进行简要说明. 查询域名 A 记录 命令格式: dig <域名> 比如,查询域名 www.al ...

  7. POJ 1671 第二类斯特林数

    思路: 递推出来斯特林数 求个和 if(i==j)f[i][j]=1; else f[i][j]=f[i-1][j-1]+f[i-1][j]*j; //By SiriusRen #include &l ...

  8. Gym - 100637B Lunch 规律

    题意:n个点,给定起点和终点,可以每次可以走一格或两格,走一格则需要一个代价,每个格子只能走一次,问从起点到终点并经过每一个点的最小代价 思路:这题我没看出什么道理,先打了个暴力,结果发现了个相当坑的 ...

  9. Coderfroces 862 B . Mahmoud and Ehab and the bipartiteness

     Mahmoud and Ehab and the bipartiteness Mahmoud and Ehab continue their adventures! As everybody in ...

  10. Linux常用PDF阅读软件

    1.福昕阅读器是一款PDF文档阅读器,对中文的支持度非常高.福昕阅读器作为全球最流行的PDF阅读器,能够快速打开.浏览.审阅.注释.签署及打印任何PDF文件. 2.evince是一个支持多种格式的文件 ...