题目描述
众所周知的是,火柴棒可以拼成各种各样的数字。具体可以看下图:

通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推。
现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用完,并且想知道能拼出的最小和最大的数分别是多少。

输入格式(stick.in)
一个数k。

输出格式(stick.out)
两个数,表示最小的数和最大的数。注意这两个数字不能有前导0。

输入样例
15

输出样例
108 7111111

数据范围
对于30%的数据k<=10。
对于60%的数据k<=20。
对于100%的数据1<k<=100。

分析:老师说有这道图片的题都很弱......

其实第二问非常好像,我们要让数字最大,就一定要让位数最大,1的火柴棒数量是最少的,我们放尽量多的1,因为k根火柴棒必须要用完,所以如果k是奇数就要放一个7,只花3根火柴棒,是最优的.

对于第一问,考虑dp,设f[i]为用i根火柴棒的最小的数,那么f[i] = min{f[i - b[j]] +j},b[j]为数字j用的火柴棒数,开个long long就能解决了,当时我怕k=100最多有50位开不下,于是用了结构体存f数组.当然,贪心也可以做,后面若干位用8,前面的用啥思考一下就能出来.

#include <bits/stdc++.h>

using namespace std;
const long long inf = ; struct node
{
long long v,tot;
int shu[];
}f[]; int k,a[],b[],sum1,sum2; void init()
{
for (int i = ; i <= ; i++)
a[i] = i;
b[] = ;
b[] = ;
b[] = ;
b[] = ;
b[] = ;
b[] = ;
b[] = ;
b[] = ;
b[] = ;
b[] = ;
} int main()
{
freopen("stick.in","r",stdin);
freopen("stick.out","w",stdout);
init();
scanf("%d",&k);
for (int i = ; i <= k; i++)
{
f[i].v = inf;
f[i].tot = ;
}
f[].v = ;
f[].tot = ;
for (int i = ; i <= k; i++)
for (int j = ; j <= ; j++)
if (i >= b[j])
{
if (i == b[j] && j == )
continue;
//f[i] = min(f[i],f[i - b[j]] * 10 + a[j]);
if (f[i].v > f[i - b[j]].v * + a[j])
{
f[i] = f[i - b[j]];
f[i].v = f[i - b[j]].v * + a[j];
f[i].shu[++f[i].tot] = j;
}
}
for (int i = ; i <= f[k].tot; i++)
printf("%d",f[k].shu[i]);
printf(" ");
sum1 = k % ;
sum2 = (k - sum1 * ) / ;
for (int i = ; i <= sum1; i++)
printf("");
for (int i = ; i <= sum2; i++)
printf("");
printf("\n");
return ;
}

清北学堂模拟赛d1t2 火柴棒 (stick)的更多相关文章

  1. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  2. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

  3. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  4. 清北学堂模拟赛day7 石子合并加强版

    /* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...

  5. 清北学堂模拟赛d6t6 棋盘迷宫

    3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...

  6. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...

  7. 清北学堂模拟赛d2t6 分糖果(candy)

    题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...

  8. 清北学堂模拟赛d2t5 吃东西(eat)

    题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...

  9. 清北学堂模拟赛d2t4 最大值(max)

    题目描述LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目:这里有一个长度为n的正整数数列ai(下标为1~n).并且有一个参数k.你需要找两个正整数x,y,使得x+k<=y, ...

随机推荐

  1. bzoj 3498: PA2009 Cakes【瞎搞】

    参考:https://www.cnblogs.com/spfa/p/7495438.html 为什么邻接表会TTTTTTTLE啊...只能用vector? 把点按照点权从大到小排序,把无向边变成排名靠 ...

  2. [Swift]Set(集)转换为Array(数组)

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. mac 修改用户权限

    想安装thinkPHP 下载完以后 访问报403错误 于是百度找 也没找到原因 自己猜测是不是用户权限问题 就是下面目录为tp的用户权限 不是root 其他是root的都能访问 于是百度搜了权限如何修 ...

  4. Androidstudio的安装与使用调试

    1安装与基本使用 1.1androidstudio的安装 1.到android-studio\bin文件夹里面,根据自己的电脑配置,打开studio.exe或者studio64.exe 2.按照向导默 ...

  5. [SHOI2013]超级跳马

    题目描述 现有一个n 行m 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.试求跳法种数mod 30011. 输入输出格式 输入格式: ...

  6. [APIO2007]动物园

    题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物. 你是动物园的公共主管.你要做的是,让每个来动物园的人都尽可能高兴.今天有一群小朋 ...

  7. 理解 Java 构造函数不可以继承

    参考来源:http://www.52bowen.com/a/2604620.html

  8. Flume中的flume-env.sh和log4j.properties配置调整建议(图文详解)

    GC是内存的回收的意思. Flume中的flume-env.sh配置调整建议 [hadoop@master conf_HostInterceptor]$ pwd /home/hadoop/app/fl ...

  9. Java 8 (4) Stream 流 - 使用

    在本节中将介绍Stream API支持的许多操作,这些操作可以完成更复杂的数据查询,如筛选.切片.映射.查找.匹配和归约.还有一些特殊的流如:数值流.来自文件和数组等多种来源的流. 筛选和切片 1.用 ...

  10. data和string类型之间的相互转换

    package main; import java.text.SimpleDateFormat;import java.util.Date; import freemarker.core.ParseE ...