CF #506(Div.3) B:子序列问题

题目描述

n 道不同难度的题,你要从中选出合适的题目组成一套竞赛试题。试题各题之间难度逐级递增,且除最后一题以外每道题的难度不低于后一道题的一半。求试题最多可以包含的题数。

输入

输入第一行含有一个整数 n (1 ≤ n ≤ 2 * 10 ^ 5) ,表示题目的个数。
输入第二行含有 n 个整数 a[1], a[2], ... , a[n] (a[i] ≤ 10 ^ 9) ,表示各个题目的难度。输入保证不重复且从小到大排列。

输出

输出一个表示最大题数的整数。

样例

Input

10
1 2 5 6 7 10 21 23 24 49

Output

4

题目分析

可以把每个输入看作只具有“连续”(a[i] ≤ a[i-1] * 2 )和“断开”(a[i] > a[i-1] * 2)两种状态。容易得知若 a[m]a[n] 连续则 a[m], a[m+1], ... , a[n] 皆连续,故问题化为求最大连续子序列。

此类问题有通用的 O(n) 、online 算法,代码如下。

AC代码

#include<iostream>
#include<algorithm>
constexpr int maxin{1000000003};
int main() {
    std::ios::sync_with_stdio(false);
    int n; std::cin >> n;
    int max{0};
    int prev{maxin}, cnt{0}; for (int i{0}; i < n; ++i) {
        int tmp; std::cin >> tmp;
        if (tmp <= prev * 2) {prev = tmp; ++cnt;}
        else {max = std::max(max, cnt); prev = tmp; cnt = 1;}
    }
    std::cout << std::max(max, cnt) << std::endl;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,421评论 0 2
  • 今天又是复习了一天的东西,感觉收获满满,回忆一下: 1.几种排序算法: 快速排序 希尔排序 冒泡排序 选择排序 插...
    来金鑫阅读 164评论 0 0
  • “天也欢喜,地也欢喜,人也欢喜。欢喜我遇到了你,你也遇到了我。生一两个孩子,一半儿像我,一半儿像你。” 这段文字来...
    我的天空是一片海阅读 633评论 0 1
  • 今天一直在店里,加了十多个好友,聊了几个尽然没用化妆品,我也是醉了,作为女人要学会爱护自己,今天虽然没完成目标,走...
    付爱宝小何阅读 184评论 0 0