zoukankan      html  css  js  c++  java
  • CodeForces

    思路:这道题无法用平时0(n^2)的解法来求最长上升子序列,会超时,只能用优化的最长上升子序列算法来求

    You are given a problemset consisting of nn problems. The difficulty of the ii -th problem is aiai . It is guaranteed that all difficulties are distinct and are given in the increasing order.

    You have to assemble the contest which consists of some problems of the given problemset. In other words, the contest you have to assemble should be a subset of problems (not necessary consecutive) of the given problemset. There is only one condition that should be satisfied: for each problem but the hardest one (the problem with the maximum difficulty) there should be a problem with the difficulty greater than the difficulty of this problem but not greater than twice the difficulty of this problem. In other words, let ai1,ai2,,aipai1,ai2,…,aip be the difficulties of the selected problems in increasing order. Then for each jj from 11 to p1p−1 aij+1aij2aij+1≤aij⋅2 should hold. It means that the contest consisting of only one problem is always valid.

    Among all contests satisfying the condition above you have to assemble one with the maximum number of problems. Your task is to find this number of problems.

    Input

    The first line of the input contains one integer nn (1n21051≤n≤2⋅105 ) — the number of problems in the problemset.

    The second line of the input contains nn integers a1,a2,,ana1,a2,…,an (1ai1091≤ai≤109 ) — difficulties of the problems. It is guaranteed that difficulties of the problems are distinct and are given in the increasing order.

    Output

    Print a single integer — maximum number of problems in the contest satisfying the condition in the problem statement.

    Examples

    Input
    10
    1 2 5 6 7 10 21 23 24 49
    Output
    4
    Input
    5
    2 10 50 110 250
    Output
    1
    Input
    6
    4 7 12 100 150 199
    Output
    3
    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <queue>
    
    using namespace std;
    
    int n, a[200000+8], dp[200000+8];
    
    int main()
    {
        scanf("%d", &n);
        for(int i = 0; i<n; i++)
            scanf("%d", &a[i]);
        int ans = 1;//寻求最优的结果
        dp[1] = 1;//一开始设最长上升子序列的1
        for(int i = 0; i<n; i++)
            {
                if(a[i-1]<a[i] && 2*a[i-1] >= a[i] && dp[i-1]+1>dp[i])//判断后一个数是不是比前一个数大且小于前一个数的2倍,并且最长上升子序列是否还可以增加
                    dp[i] = dp[i-1]+1;
                else dp[i] = 1;
                ans = max(ans, dp[i]);//因为最后一个dp不一定是最长上升子序列,所以要让某个数把最大的结果存起来
            }
        printf("%d
    ", ans);
        return 0;
    }
  • 相关阅读:
    QQ在线人数图表
    使LumaQQ.NET支持接收长消息
    发现有趣的东东,Live Mail能自动显示人名
    关于转换QQ消息中系统表情,自定义表情和截图的函数
    使用Autofac,提示重写成员“Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(System.Type)”时违反了继承安全性规则。重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。
    libvirt笔记(未完待续)
    OpenStack Grizzly版本部署(离线)
    git学习笔记
    MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
    Response 关于浏览器header的方法
  • 原文地址:https://www.cnblogs.com/RootVount/p/10478757.html
Copyright © 2011-2022 走看看