题目大意:给出N个数,要求你找出最少的下降序列
解题思路:用一个数组纪录每个下降序列的最小值
如果新来的数字大于数组中的最大值,那么下降序列的数量加1,并将该数加入数组
如果新来的数小于数组中的最大值,那就将数组中的第一个大于它的数替换成该数
用到了贪心思想
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000010;
int high[N];
int n, cnt;
int find(int r, int t) {
int l = 0, mid;
while (l < r) {
mid = (l + r) / 2;
if (high[mid] <= t)
l = mid + 1;
else
r = mid;
}
return r;
}
void solve() {
high[0] = -1;
int top = 0, t, cnt = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &t);
if (t >= high[top]) {
cnt++;
high[++top] = t;
}
else {
int pos = find(top, t);
high[pos] = t;
}
}
printf("%d\n", cnt);
}
int main() {
while (scanf("%d", &n) != EOF) solve();
return 0;
}