**lower_bound( )和upper_bound( )**都是利用二分查找的方法在一个排好序的数组中进行查找的。
排队问题:
在从小到大的排序数组中,
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
在从大到小的排序数组中,重载lower_bound()和upper_bound()
lower_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
/*OYC*/
#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){
int n;
int a[1002];
int rank[1002];
while(scanf("%d",&n)==1){
int count=0; //队伍数
for (int i=0;i<n;i++) scanf("%d",&a[i]); //身高
i=0;
while(i<n){
if(count==0||a[i]>rank[count-1]){ //大于任一队伍尾巴身高时
rank[count]=a[i];
count++;
}else rank[lower_bound(rank,rank+count,a[i])-rank]=a[i];
//用把a[i]放在身高差最小的小朋友后面 ,即,代替差值最小的数
i++;
}
printf("%d\n",count);
}
return 0;
}