define DeBUG
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <set>
#include <sstream>
#include <map>
#include <bitset>
using namespace std ;
#define zero {0}
#define INF 2000000000
#define EPS 1e-6
typedef long long LL;
const double PI = acos(-1.0);
inline int sgn(double x)
{
return fabs(x) < EPS ? 0 : (x < 0 ? -1 : 1);
}
int cmp(int a, int b)
{
return a > b;
}
int main()
{
#ifdef DeBUGs
freopen("//home//amb//桌面//1.in", "r", stdin);
#endif
int n;
while (scanf("%d", &n) + 1)
{
int a[4000] = zero;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
// cout<<a[i]<<" ";
}
sort(a, a + n, cmp);
int que[4000] = zero;
int quenum = 0;
int l, r, m;
int now;
for (int i = 0; i < n; i++)
{
l = 0;
r = quenum;
now = a[i];
if (now>= que[quenum])//que序列从小到大排列,接下来是在序列里找一个刚好大于now的,没有就把now加入序列的最右边
{
que[++quenum] = now;
continue;
}
while (l < r)
{
m = (l + r) / 2;
if (now >= que[m])
l = m+1;
else
r = m;
}
que[l] = now;//找到后进行替换,因为每个大的只能带一个小的
}
printf("%d\n", quenum==0?1:quenum);//这题的坑爹点,可以无视
}
return 0;
}
hdu1800 排序二分法nlogn
最新推荐文章于 2022-03-22 09:51:48 发布