Description

对于每个数字x,我们总可以把它表示成一些斐波拉切数字之和,比如8 = 5 + 3, 而22 = 21 + 1,因此我们可以写成 x = a1 * Fib1 + a2 * Fib2 + a3 * Fib3 + … + an * Fibn, 其中,Fib1 = 1, Fib2 = 2…. Fib[i] = Fib[i – 1] + Fib[I - 2], 且a[n] > 0.那么我们称ai为x的一种斐波拉切表示,由于表示方法有很多种,我们要求最大化a[1…n],即,如果b[1…n]和a[1…m]都可以表示x,若m > n 则a更大,若 m = n, 则从高位到低位比,第一个不同处i,若ai > bi 则a比b大。

你的任务很简单,给你两个用斐波拉切数最大化表示的两个数字,输出他们相加后用斐波那契最大化表示的数字。

Input

两行,分别表示两个数字

每一行开头一个n,表示长度

然后紧接着n个数字,为从低位到高位。

Output

同输入格式。一行。

Sample Input

4 0 1 0 1

5 0 1 0 0 1

Sample Output

6 1 0 1 0 0 1

Data Constraint

对于30%的数据 长度 <= 1000

对于100%的数据 长度 <= 1000000

Solution

  • 在两数相加的时候,其实不需要表示成斐波拉契的形式,因为我们可以通过读入的信息得到答案。

  • 我们把两序列逐位相加,得到一个全新的序列,即为答案。

  • 但这仍不是最优表示,还存在一些 连续的 1 或 一些 2

  • 于是我们将这些“进位”掉,并注意判断特殊情况即可,复杂度是线性的。

  • 注意:本题读入输出文件较大,可以使用C++读入输出优化(不会的戳这里),可大大优化时间。

Code

#include<cstdio>
using namespace std;
int a[1000005];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline void dfs(int x,int y)
{while(x<=y && x<=a[0]){if(a[x]){if(a[x]>=1 && a[x+1]>=1){if(x+2>a[0]) a[0]=x+2;a[x+2]++;a[x]--,a[x+1]--;}if(a[x]>=2){if(x==a[0]) a[++a[0]]++; else a[x+1]++;int z=x-2;if(!z) z++; else if(z<0) z=-1;if(z>=0) a[z]++;a[x]-=2;if(a[z]>=2 || z>=0 && a[z+1]>=1) dfs(z,x); elseif(z>1 && a[z-1]>=1) dfs(z-1,x);}if(a[x]>=1 && a[x+1]>=1){if(x+2>a[0]) a[0]=x+2;a[x+2]++;a[x]--,a[x+1]--;}}x++;}
}
int main()
{a[0]=read();for(int i=1;i<=a[0];i++) a[i]=read();int k=read();for(int i=1;i<=k;i++) a[i]+=read();if(k>a[0]) a[0]=k;dfs(1,1e9);printf("%d",a[0]);for(int i=1;i<=a[0];i++){putchar(' ');if(a[i]) putchar('1'); else putchar('0');}return 0;
}

JZOJ 3769. 【NOI2015模拟8.14】A+B相关推荐

  1. [模拟] leetcode 14 最长公共前缀

    [模拟] leetcode 14 最长公共前缀 1.题目 题目链接 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例1: 输入: [& ...

  2. Cisco PT模拟实验(14) 路由器OSPF动态路由的配置

    Cisco PT模拟实验(14) 路由器OSPF动态路由的配置 实验目的: 掌握OSPF动态路由选择协议的配置方法 掌握路由选择表中的OSPF路由描述 熟悉路由选择和分组转发的原理及过程 实验背景: ...

  3. JZOJ.5274【NOIP2017模拟8.14】数组

    Description Input Output Sample Input 输入样例1: 3 2 7 5 4 2输入样例2: 5 3 1 5 4 3 5 5 Sample Output 输出样例1: ...

  4. JZOJ 3819. 【NOI2015模拟9.9】取石子

    Description Input Output Sample Input 3 3 1 1 2 2 3 4 3 2 3 5 Sample Output YES NO NO Data Constrain ...

  5. JZOJ 3789. 【NOI2015模拟8.20】编辑器

    Description 你正在设计一种新型的编辑器,这种编辑器可以高效地处理整数序列. 编辑器启动时,序列为空,光标指向序列的头部.编辑器支持下列 5 种操作: 1. I x 把整数 x 插入到光标位 ...

  6. JZOJ 3786. 【NOI2015模拟8.19】图

    Description 给定一个 n 个点 m 条边的无向图,进行多次询问,每次询问点 a 是否能经过恰好 c 条边到达点 b(当然,可以对于一条边可以来回经过多次) . Input 第一行三个数 n ...

  7. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  8. JZOJ 100046. 【NOIP2017提高A组模拟7.14】收集卡片

    Description Star 计划订购一本将要发行的周刊杂志,但他可不是为了读书,而是-- 集卡. 已知杂志将要发行 N 周(也就是 N 期),每期都会附赠一张卡片.Star 通 过种种途径,了解 ...

  9. jzoj3771. 【NOI2015模拟8.15】小 Z 的烦恼

    Description 小 Z 最近遇上了大麻烦,他的数学分析挂科了.于是他只好找数分老师求情. 善良的数分老师答应不挂他,但是要求小 Z 帮助他一起解决一个难题问题是这样的,现在有 n 个标号为 1 ...

最新文章

  1. Python,OpenCV使用KNN来构建手写数字及字母识别OCR
  2. PMCAFF微课堂 | 阿里高级产品专家: 揭秘B类App如何在高速生长期凝结含金量
  3. C 语言资源大全中文版
  4. 深入了解crc32算法
  5. 安卓添加滚轮代码_[按键精灵手机版教程]安卓实战——制作天天酷跑脚本(2)...
  6. 3dmax导出fbx没有贴图_实例讲解ArcGIS 与 3DMax 结合建模
  7. linux c语言头文件 在另外的地方,linux下的c语言的头文件在windows下头文件是哪几个?...
  8. 利用Adobe Photoshop 2020导入和批量输出论文中的图片
  9. 【转】 Pro Android学习笔记(五八):Preferences(2):CheckBoxPreference
  10. 麒麟案例 | 传统企业偶遇“麒麟计划” 相见恨晚 ,却恰逢其时!
  11. 关于 ZVT 的后期蜈蚣打发研究
  12. 国内用户最多的linux系统,统信UOS将可能超越麒麟系统夺得中国Linux市场份额第一名...
  13. 使用ifconfig结合awk提取主机的IP地址方法
  14. Shader:优化破解变体的“影分身”之术
  15. 数据库-Oracle
  16. win10如何调整计算机时间同步,Win10系统如何设置时间同步间隔?修改时间同步频率的方法...
  17. 我国标准与国际标准的关系
  18. 短线操盘的10种方法、
  19. 【Qt作业】利用帧动画实现运动的小人
  20. 2020国赛C思路分析:中小微企业的信贷决策

热门文章

  1. Python学习笔记:list和tuple
  2. win10:tensorflow学习笔记(2)
  3. Linux系统proc详解
  4. 【编程】位运算(异或)
  5. [云炬创业学笔记]第三章商业创意的发掘与评估测试5
  6. [我的1024开源程序]100元写的软件工程和VB试题
  7. 让iis支持下载apk,ipa文件
  8. installshield 4075 错误
  9. linux的swap增加的二个办法
  10. ASP.NET一个网站内存放多个config文件(Web.Config文件中configSource 的用法