P1091 合唱队形

题目描述

NN位同学站成一排,音乐老师要请其中的(N−KN−K)位同学出列,使得剩下的KK位同学排成合唱队形。

合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他们的身高分别为T1,T2,…,TKT1​,T2​,…,TK​, 则他们的身高满足T1<...Ti+1>…>TK(1≤i≤K)T1​<...Ti+1​>…>TK​(1≤i≤K)。

你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入格式

共二行。

第一行是一个整数N(2≤N≤100)N(2≤N≤100),表示同学的总数。

第二行有nn个整数,用空格分隔,第ii个整数Ti(130≤Ti≤230)Ti​(130≤Ti​≤230)是第ii位同学的身高(厘米)。

输出格式

一个整数,最少需要几位同学出列。

输入输出样例

输入 #1复制

8
186 186 150 200 160 130 197 220

输出 #1复制

4

说明/提示

对于50%的数据,保证有n≤20n≤20;

对于全部的数据,保证有n≤100n≤100。

#include 
using namespace std;
int value[100001];

int main(){
    ios::sync_with_stdio(0);
    int a[100005],b[100005],c[100005],d[100005],n=0,len=1,len2=1;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    b[len]=a[1];
    c[len2]=a[n];
    for(int i=1;i<=n;i++){
        if(a[i]>b[len])b[++len]=a[i];
        else {
            int p = lower_bound(b+1, b+len+1, a[i])-b;
            b[p]=a[i];
        }
        d[i]+=len;
    }
    for(int i=n;i>=1;i--){
        if(a[i]>c[len2])c[++len2]=a[i];
        else {
            int p = lower_bound(c+1, c+len2+1, a[i])-c;
            c[p]=a[i];
        }
        d[i]+=len2;
        d[i]--;
    }
    int mmax=d[1];
    for(int i=2;i<=n;i++)
        if(d[i]>mmax)mmax=d[i];
    cout<

 

你可能感兴趣的:(洛谷)