2017北京国庆刷题Day1 morning T2
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的更多相关文章
- 2017北京国庆刷题Day1 afternoon
期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目 ...
- 2017北京国庆刷题Day1 morning
期望得分:100+100+100=300 实际得分:100+100+70=270 T1位运算1(bit) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK ...
- 2017北京国庆刷题Day2 afternoon
期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一 ...
- 2017北京国庆刷题Day2 morning
期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK ...
- 2017北京国庆刷题Day4 morning
期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...
- 2017北京国庆刷题Day7 morning
期望得分:100+0+100=200 实际得分:100+20+0=120 离散化搞搞 #include<cstdio> #include<iostream> #include& ...
- 2017北京国庆刷题Day5 afternoon
期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...
- 2017北京国庆刷题Day3 afternoon
期望得分:100+0+30=130 实际得分:100+36.5+0=136.5 T3 一个变量写混了,丢了30.. 模拟栈 #include<cstdio> #include<cst ...
- 2017北京国庆刷题Day3 morning
期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...
随机推荐
- 【Linux软件安装】
安装约定 软件安装在/opt目录下,opt目录规范: modules:软件安装的目录 softwares:软件包目录 tools:工具目录 datas:数据目录 如果出现 No XXX package ...
- Linux:SAMBA共享、NFS共享、Autofs自动挂载
SAMBA.NFS共享区别 NFS开源文件共享程序:NFS(NetworkFile System)是一个能够将多台Linux的远程主机数据挂载到本地目录的服务,属于轻量级的文件共享服务,不支持Linu ...
- java基数排序
代码如下: import java.util.Arrays; public class MultiKeyRadixSort { public static void radixSort(int [] ...
- mysql function 查询子级机构
DROP FUNCTION IF EXISTS queryChildOrgList;CREATE FUNCTION queryChildOrgList(id VARCHAR(20))RETURNS V ...
- noip模拟赛 业务办理
[问题描述]在银行柜台前,有 n 个顾客排队办理业务. 队伍中从前往后,第 i 位顾客办理业务需要ti 分钟时间. 一位顾客的等待时间定义为:队伍中在他之前的所有顾客和他自己的办理业务时间的总和.第 ...
- 【BZOJ3790】神奇项链(manacher,树状数组)
题意: 思路:生成一些回文拼起来使生成的段数最小 显然存在一种最优的方案,使生成的那些回文是目标串的极长回文子串 求出对于每个位置的最长回文子串,问题就转化成了: 给定一些已知起始和终止位置的线段,求 ...
- codeforces gym 100357 K (表达式 模拟)
题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...
- kendo中需要kendo.default.min.css
kendo中需要kendo.default.min.css,这个默认是没有加入头文件的,还是需要手动加入一下 <link href="~/Scripts/kendo/styles/ke ...
- HDU——1023 Train Problem II
Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 函数操作(this操作)
1.apply/call函数:会改变this关键字,并且第一个参数作为this关键字. /*apply与call区别*/ console.log(Array.prototype.join.call([ ...