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. 【Linux软件安装】

    安装约定 软件安装在/opt目录下,opt目录规范: modules:软件安装的目录 softwares:软件包目录 tools:工具目录 datas:数据目录 如果出现 No XXX package ...

  2. Linux:SAMBA共享、NFS共享、Autofs自动挂载

    SAMBA.NFS共享区别 NFS开源文件共享程序:NFS(NetworkFile System)是一个能够将多台Linux的远程主机数据挂载到本地目录的服务,属于轻量级的文件共享服务,不支持Linu ...

  3. java基数排序

    代码如下: import java.util.Arrays; public class MultiKeyRadixSort { public static void radixSort(int [] ...

  4. mysql function 查询子级机构

    DROP FUNCTION IF EXISTS queryChildOrgList;CREATE FUNCTION queryChildOrgList(id VARCHAR(20))RETURNS V ...

  5. noip模拟赛 业务办理

    [问题描述]在银行柜台前,有 n 个顾客排队办理业务. 队伍中从前往后,第 i 位顾客办理业务需要ti 分钟时间. 一位顾客的等待时间定义为:队伍中在他之前的所有顾客和他自己的办理业务时间的总和.第 ...

  6. 【BZOJ3790】神奇项链(manacher,树状数组)

    题意: 思路:生成一些回文拼起来使生成的段数最小 显然存在一种最优的方案,使生成的那些回文是目标串的极长回文子串 求出对于每个位置的最长回文子串,问题就转化成了: 给定一些已知起始和终止位置的线段,求 ...

  7. codeforces gym 100357 K (表达式 模拟)

    题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...

  8. kendo中需要kendo.default.min.css

    kendo中需要kendo.default.min.css,这个默认是没有加入头文件的,还是需要手动加入一下 <link href="~/Scripts/kendo/styles/ke ...

  9. HDU——1023 Train Problem II

    Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. 函数操作(this操作)

    1.apply/call函数:会改变this关键字,并且第一个参数作为this关键字. /*apply与call区别*/ console.log(Array.prototype.join.call([ ...