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 }
  • 相关阅读:
    Shader 结构体中语义的理解
    计算包围盒中心坐标
    c#脚本控制shader
    PS2键盘 + LCD12864 实验
    基于M9K块配置ROM的LCD12864图片显示实验
    LCD12864 液晶显示-汉字及自定义显示(串口)
    LCD12864 液晶显示-汉字及自定义显示(并口)
    基于Verilog HDL 的数字电压表设计
    基于Verilog HDL的ADC0809CCN数据采样
    触发器(基本的SR触发器、同步触发器、D触发器)
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8976887.html
Copyright © 2011-2022 走看看