博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP模拟题 斐波那契数列
阅读量:4634 次
发布时间:2019-06-09

本文共 822 字,大约阅读时间需要 2 分钟。

题目大意

给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项。

 

题解

不难发现$2\times 10^9$之内的斐波那契数不超过$50$个

先求出第$i$个数之前最后一个能和第$i$个数相加为斐波那契数的位置$last_i$。

考虑每一部分$[l,r]$只需满足$\max\{last_i\}<l(i\in [l,r])$即可。

那么设$F_i$表示以$i$为结尾最小化分数,那么转移到$i$的$j$显然是一段左右端点均单调不递减的区间,用单调队列维护即可。

#include
#define debug(x) cerr<<#x<<" = "<
MP; int n,m,p[M],F[M],last[M],G[M],q[M],hd,tl;int main(){ G[1]=1,G[2]=2,F[1]=1; n=read(); for(m=2;(LL)G[m-1]+(LL)G[m]<=MAXN;m++) G[m+1]=G[m]+G[m-1]; for(int i=1;i<=n;i++) p[i]=read(); MP[p[1]]=1,q[tl++]=0,q[tl++]=1; for(int i=2,now=0;i<=n;i++){ last[i]=0; for(int j=0;j<=m;j++){ if(!MP.count(G[j]-p[i])) continue; int k=MP[G[j]-p[i]]; last[i]=max(last[i],k); } now=max(now,last[i]); while(q[hd]
=F[i]&&hd

转载于:https://www.cnblogs.com/OYJason/p/9900510.html

你可能感兴趣的文章
函数指针&amp;绑定: boost::functoin/std::function/bind
查看>>
js实现双击后网页自己主动跑-------Day55
查看>>
TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总
查看>>
PS多形式的部分之间复制“笨办法”
查看>>
最强的篮球队和马尔可夫模型
查看>>
hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询
查看>>
cocos2d-x 音效中断问题
查看>>
设计模式简要笔记
查看>>
子分类账知识学习(汇总网上比较有用的资料)
查看>>
关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题...
查看>>
pyQt 每日一练习 -- 登录框
查看>>
wp 删除独立存储空间文件(多级非空文件夹删除)
查看>>
Loadrunner安装使用入门
查看>>
smartupload 上传文件时 把页面编码改成gbk 解决乱码
查看>>
EPS是什么格式
查看>>
新闻网大数据实时分析可视化系统项目——5、Hadoop2.X HA架构与部署
查看>>
【原创】Linux环境下的图形系统和AMD R600显卡编程(11)——R600指令集
查看>>
input禁止显示历史输入记录
查看>>
本日进度6
查看>>
两下或多下回车造成数据库多次提交事物的解决方法
查看>>