zoukankan      html  css  js  c++  java
  • 勤奋的杨老师

    题目描述

    杨老师认为他的学习能力曲线是一个拱形。勤奋的他根据时间的先后顺序罗列了一个学习清单,共有n个知识点。但是清单中的知识并不是一定要学习的,可以在不改变先后顺序的情况下有选择的进行学习,而每一个知识点都对应一个难度值。杨老师希望,后学习的知识点的难度一定不低于前一个知识点的难度(i<j时ai<=aj),而可能存在一个临界点,在临界点以后,他希望后学习的知识点的难度一定不高于前一个知识点的难度(i<j时ai>=aj)。杨老师想尽可能多的学习知识。请问:杨老师最多可以学习多少知识?

    输入描述:

    第一行:一个整数n(0<n<500000)接下来一行:n个整数,第i个整数ai(0<=ai<500000)表示第i道题目的难度。

    输出描述:

    一行一个整数,表示杨老师最多可以学习多少个知识。
    示例1

    输入

    5
    1 4 2 5 1

    输出

    4

    挺好的题目,求最长增子序列。
    二分做。
     1 #include <bits/stdc++.h>
     2 #define INF 0x3f3f3f3f
     3 #define ll long long
     4 using namespace std;
     5 const int N = 5e5+10;
     6 int a[N], dp1[N], dp2[N], f[N];
     7 int main() {
     8     int n, MAX = 0;
     9     cin >> n;
    10     for(int i = 0; i < n; i ++) cin >> a[i];
    11     memset(f,INF,sizeof(f));
    12     for(int i = 0; i < n; i ++) {
    13         *upper_bound(f,f+n,a[i]) = a[i];
    14         dp1[i] = lower_bound(f,f+n,INF)-f;
    15     }
    16     for(int i = 0; i < n/2; i ++ )swap(a[i],a[n-i-1]);
    17     // for(int i = 0; i < n; i ++) printf("%d ", a[i]);printf("
    ");
    18     memset(f,INF,sizeof(f));
    19     for(int i = 0; i < n; i ++) {
    20         *upper_bound(f,f+n,a[i]) = a[i];
    21         dp2[i] = lower_bound(f,f+n,INF)-f;
    22     }
    23     for(int i = 0; i < n; i ++) {
    24         // printf("%d %d
    ",dp1[i],dp2[i]);
    25         MAX = max(MAX,dp1[i]+dp2[n-i-1]);
    26     }
    27     printf("%d
    ",MAX-1);
    28     return 0;
    29 }
  • 相关阅读:
    TP3.2写上下篇
    TP3.2写分页
    TP3.2写提交的验证码验证
    thinkphp5.0学习笔记(四)数据库的操作
    thinkphp5.0学习笔记(三)获取信息,变量,绑定参数
    Windows下用Composer引入官方GitHub扩展包
    glog的安装使用
    实现strStr()函数
    何时将析构函数声明为私有?
    memcpy内存重叠
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8976887.html
Copyright © 2011-2022 走看看