#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int num[1010],arr[1010],len;
int Bse(int i){//二分查找
int l=0,r=len,mid;
while(l<r){
mid=l+(r-l)/2;
if(arr[mid]>num[i]){
r=mid;//不能写成r=mid-1;!!!
}else{
l=mid+1;
}
}
return l;
}
int main(){
int t,n,m,i,s;
scanf("%d",&t);
while(t--){
memset(num,0,sizeof (num));
memset(arr,0,sizeof (arr));
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
arr[len=0]=num[0];
for(i=1;i<n;i++){
if(num[i]>arr[len]){
arr[++len]=num[i];
}else{
//s=lower_bound(arr,arr+len,num[i])-arr;和二分查找相似
s=Bse(i);
//printf("%d\n",s);
arr[s]=num[i];
}
}
printf("%d\n",n-len-1);
}
return 0;
}
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~
返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置。
在头文件algorithm里