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. Python基础之函数参数与返回值进阶

    参数作用:如果外界希望在函数内部处理数据,就可以将数据作为参数传入函数内部: 返回值作用:如果希望一个函数函数执行完成后,向外界报告函数的执行结果,就可以使用函数的返回值. 函数的返回值 进阶 利用元 ...

  2. Windows学习总结(10)——Windows系统中常用的CMD命令详解

    1.ping命令 ping是电脑网络故障诊断中的常用的命令,它的作用是用来检查网络是否通畅或者网络连接速度.我们来看一下PING命令的具体表述. 日常的诊断过程中我们最常用到的就是诊断连接是否通畅. ...

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

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

  4. scrapy的User-Agent中间件、代理IP中间件、cookies设置、多个爬虫自定义settings设置

    在scrapy的反爬中,常用的几个配置,简单总结了下: User-Agent中间件: from fake_useragent import UserAgent class RandomUserAgen ...

  5. (三)用openCV在图片上绘画标记

    1.在图片上画图(直线,矩形,圆形,多边形) import numpy as np import cv2 img = cv2.imread('watch.jpg',cv2.IMREAD_COLOR) ...

  6. multiple instance of mac app

    一般情况下,mac系统上的应用程序只能启动一个实例,现在做项目,需要mac上同时启动多个实例,如何做呢,下面就说明完成这个功能的方法: 主要原理:利用 open -n Applications/XXX ...

  7. [poj2311]Cutting Game_博弈论

    Cutting Game poj-2311 题目大意:题目链接 注释:略. 想法: 我们发现一次操作就是将这个ICG对应游戏图上的一枚棋子变成两枚. 又因为SG定理的存在,记忆化搜索即可. 最后,附上 ...

  8. 洛谷—— P2658 汽车拉力比赛

    https://www.luogu.org/problem/show?pid=2658 题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ...

  9. codevs——2645 Spore

    2645 Spore  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 某陈和某Y 最近对一个游戏着迷.那 ...

  10. 玲珑杯 ACM Round #12

    A =w= B 占坑 C 题意:有长度为n的序列A和长度为n的序列W,以及一个G,对于Ui,1<=Ui<=Wi,求Σgcd(Ai,Ui)=G的方案数,n<=1e3,Ai<=1e ...