1. 程式人生 > >hihocoder 1797 單調遞增子序列 二分

hihocoder 1797 單調遞增子序列 二分

給定一個包含N個整數的序列A1, A2, ... AN,你可以從中刪除一段連續的子序列,使得剩下的序列是單調遞增(不減)的。

請你求出最少刪除幾個元素。

Input

第一行包含一個整數N。  

第二行包含N個整數A1, A2, ... AN。  

對於30%的資料,1 ≤ N ≤ 1000  

對於100%的資料,1 ≤ N ≤ 100000, 1 ≤ Ai ≤ 1000000

Output

一個整數表示答案。

Sample Input

6  
1 2 3 1 1 5

Sample Output

2

題意簡單明瞭,如果是連起來的話,肯定是前面的一段連續的還有後面的連續的

所以只需要在後面找到剛好大於等於前面的值,序列是有序的,直接二分查詢,或者用lower_bound即可,

程式碼如下

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main()
{
    int n;
    scanf("%d",&n);
    int l=0;
    int r=n-1;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1;i<n;i++)
    {
        if(a[i]>=a[i-1])
            l++;
        else
            break;
    }
     for(int i=n-1;i>=1;i--)
    {
        if(a[i]>=a[i-1])
            r--;
        else
            break;
    }
    //printf("%d   ",l);
    if(r==0||l==n-1)
    {
        printf("0\n");
        return 0;
    }
    //printf("%d %d",l,r);
    int ans=r;
    for(int i=0;i<=l;i++)
    {
        int p=int(lower_bound(a+r,a+n,a[i])-a);
        ans=min(ans,p-i-1);
    }
    printf("%d\n",ans);
}