[贪心+斐波那契]算法题

这是一篇关于算法的博客,讨论了如何利用贪心策略和斐波那契数列解决判断一段区间内木棍能否构成三角形的问题。当区间长度大于100时,由于斐波那契数列的性质,必然存在三条边能构成三角形。对于较小区间,可以采用枚举最大边的方法进行判断。博主分享了自己的AC代码,并邀请读者指正错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面

小C是一个可爱的女孩,她特别喜欢世界上最稳定的图形:三角形。有一天她得到了n根木棍,她把这些木棍随意的摆放成一行。小K来和小C玩,他发现了这排木棍,突然想知道在一段区间[l,r]之间的木棍(即第L根到第R根木棍)是否可以组成一个三角形,小C表示她不会,所以请你帮忙。

输入

数据只有一组。

第一行只有一个数字N,代表一共有N根木棍,N<=100000。

第二行为N个数,代表每根木棍的长度。每根木棍的大小不超过1e18。

第三行为一个数字Q,代表询问数目,Q<=100000。

接下来的Q行,每一行有两个数字L和R,代表询问的区间。其中L和R满足1<=L<=R<=N。

输出

对于每个询问,如果可以组成三角形输出”Yes”,否则输出”No”(不需要加引号)。

输如样例
5
2 3 3 4 10
2
1 3
3 5
输出样例
Yes
No
分析题目

首先可以知道斐波那契数列数列第i项等于第i-1和第i-2项之和,可以想到的是当项数大于100时,第100项已经超过1e10了。当搜索的区间长度大于100时,肯定存在这样的三条边构成三角形。为什么?因为斐波那契数列已经是差一点就可以构成三角形了。int 的范围是有限的,在这有限的区间里面最坏情况是斐波那契数列,数量超过这个,一定存在满足构成三角形的三个数。

当个数小于50的时候:

暴力枚举:

当然不是三重循环: 可以枚举最大值。看看是否存在一个三角形包含这条边,最坏的情况是他前面两条边(排好序了)都不能包含,那么这条一定不被其他边包含(简单证明),如果不满足,移除这一条边。那么我们从大到小枚举边的长度即可。

AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值