#include <iostream>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
int BinarySearch( int *a, int l, int r, int key )
{
int mid;
while( l <= r )
{
mid = ( l + r ) >> 1;
if( a[mid] >= key )
r = mid - 1;
else
l = mid + 1;
}
return l;
}
int main()
{
int n;
int a[1001];
int dp[1001];
cin >> n;
for( int i=0; i<n; i++ )
cin >> a[i];
dp[0] = a[0];
int x = 0;
for( int i=1; i<n; i++ )
{
if( a[i] <= dp[x] )
{
int pos = BinarySearch( dp, 0, x, a[i] );
dp[pos] = a[i];
}
else
{
x++;
dp[x] = a[i];
}
}
for( int i=0; i<=x; i++ )
cout << dp[i] << endl;
cout << x+1 << endl;
return 0;
}
另外补充下二分查找:
1、找到的话且这个数唯一则返回下标位置,如果不唯一则返回最右边的下标;找不到的话返回比它大的第一个数(即右边的数)的下标。
int BinarySearch( int *a, int l, int r, int key )
{
int mid;
while( l <= r )
{
mid = ( l + r ) >> 1;
if( a[mid] >= key )
r = mid - 1;
else
l = mid + 1;
}
return l;
}
2、找不到的话返回比它小的第一个数(即左边的数)的下标
int BinarySearch( int *a, int l, int r, int key )
{
int mid;
while( l <= r )
{
mid = ( l + r ) >> 1;
if( a[mid] > key )
r = mid - 1;
else
l = mid + 1;
}
return r;
}