hihocoder 1797 單調遞增子序列 二分
阿新 • • 發佈:2018-12-22
給定一個包含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); }