T2火柴棒 (stick)

Time Limit:1000ms   Memory Limit:128MB

题目描述

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

通过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。

k<=1e5可做?

知道什么叫搜索吗?就是dfs啊~

可以过k<=100000

贪心有反例 比如31  最小数是20088 不是22888

加了那么十来句剪枝就很快了~ 理论上还能更快

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define N 10100000 using namespace std;
int n,m,k,len1,len2,num,opt;
int ans1[N],ans2[N],pre[N],tmp[N],len;
int use[]={,,,,,,,,,}; bool cmp(int a,int b){return a>b;} inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void update(int num)
{
if(len1<num) return;//8
if(len1==num && pre[]>ans1[] || pre[]>ans1[]) return;//9 for(int i=;i<=num;i++) tmp[i]=pre[i];
sort(pre+,pre+num+);
if(pre[]==)
for(int i=;i<=num;i++)
{
if(pre[i]!=){int j=pre[i];pre[i]=;pre[]=j;break;}
}
int flag=;if(len1>num) flag=;
else
for(int i=;i<=num;i++)
{
if(pre[i]<ans1[i])
{
flag=;break;
}
}
if(len1<num) flag=;
if(flag)
{
for(int i=;i<=num;i++) ans1[i]=pre[i];len1=num;
}
for(int i=;i<=num;i++) pre[i]=tmp[i];
} void dfs(int res)
{
if(res==)
{
update(num);
return;
}
//if(opt) return;
/*if(res%7==0)
{
for(int i=1;i<=num;i++) ans1[i]=pre[i];
for(int i=num+1;i<=num+res/7;i++) ans1[i]=8;
opt=1;
}*/
if(pre[]>ans1[] || pre[]>ans1[]) return;//1
if(len1-num> && (len1-num)*-res<) return;//2
if(num>len1/ && k-res<res) return;//3
if(num>=len1) return;//4
if(res<) return;//5 for(int i=;i<=;i++)
{ if(res== && i>) break;//6
if(res== && i>) break;//7
if(i== && num==) continue;
if(res-use[i]<) continue;
num+=; pre[num]=i;
dfs(res-use[i]);num--;
}
} int main()
{
k=read();
memset(ans1,/,sizeof ans1);
len1=k/+;
if(k%==) for(int i=;i<=k/;i++) ans2[i]=;
if(k%!=) {for(int i=;i<=k/;i++) ans2[i]=;ans2[]=;}
if(k%==) for(int i=;i<=k/;i++) ans1[i]=,len1=k/;
else dfs(k);
for(int i=;i<=len1;i++) printf("%d",ans1[i]);
printf(" ");
for(int i=;i<=k/;i++) printf("%d",ans2[i]);
return ;
}

2017北京国庆刷题Day1 morning T2的更多相关文章

  1. 2017北京国庆刷题Day1 afternoon

    期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目 ...

  2. 2017北京国庆刷题Day1 morning

    期望得分:100+100+100=300 实际得分:100+100+70=270 T1位运算1(bit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK ...

  3. 2017北京国庆刷题Day2 afternoon

    期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一 ...

  4. 2017北京国庆刷题Day2 morning

    期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK ...

  5. 2017北京国庆刷题Day4 morning

    期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...

  6. 2017北京国庆刷题Day7 morning

    期望得分:100+0+100=200 实际得分:100+20+0=120 离散化搞搞 #include<cstdio> #include<iostream> #include& ...

  7. 2017北京国庆刷题Day5 afternoon

    期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...

  8. 2017北京国庆刷题Day3 afternoon

    期望得分:100+0+30=130 实际得分:100+36.5+0=136.5 T3 一个变量写混了,丢了30.. 模拟栈 #include<cstdio> #include<cst ...

  9. 2017北京国庆刷题Day3 morning

    期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...

随机推荐

  1. php第二十九节课

    文件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  2. Python学习-算术运算符,赋值运算符和复合运算符

    算术运算符 常见的算术运算符有 : +     加法运算符 print(1 + 2); // 3 print('1' + '2'); //12 不仅可以进行2个数字的相加,还可以连接2个字符串 -   ...

  3. linux基础常用语句--新手

    查询:ls查看全部内容:ls -n删除:rm -rf 文件名创建目录: mkdir解压:rpm -验证是否安装:rpm -p 文件名rpm -ivh --nodeps 不需要前置条件的安装查询当前路径 ...

  4. AWK简单使用方法

    1. 命令格式 gawk [OPTIONS] 'program' FILES.... program:'PATTERN{ACTION}' 一条awk命令中,PATTERN和ACTION,至少存在一个才 ...

  5. Jmeter逻辑控制器-ForEach Controller

    ForEach Controller 介绍 ForEach Contoller 即循环控制器,顾名思义是定义一个规则.主要有以下一个参数: 名称:随便填写 注释:随便填写 输入变量前缀:可以在&quo ...

  6. plotting and saving over line in paraView

    probe -- provides the field values in a particular location in space To save plotoverline to csv fil ...

  7. Linux学习总结(21)——CentOS7环境下FTP服务器的安装和配置

    1. 安装vsftpd #安装vsftpd yum install -y vsftpd #设置开机启动 systemctl enable vsftpd.service # 重启 service vsf ...

  8. Docker学习总结(18)——阿里超大规模Docker化之路

    12月6-7日,由阿里巴巴集团.阿里巴巴技术发展部.阿里云云栖社区联合主办,以"2016双11技术创新"为主题的阿里巴巴技术论坛上,阿里巴巴研究员林昊分享了阿里超大规模Docker ...

  9. [K/3Cloud] KSQL 关联表更新字段Update语法

    关联表更新字段 UPDATE tmp369faa3f7d224b0595670425008 as t1 SET FStatus=-1 where exists(select 1 from t_BD_S ...

  10. ISO和焦距

    要说什么是ISO还要从传统胶片相机说起,ISO称作为感光度,它是衡量传统相机所使用胶片感光速度的国际统一指标,其反映了胶片感光时的速度(其实是银元素与光线的光化学反应速率).而对于现在并不使用胶片的数 ...