输出包含多行,第一行包括一个整数,代表信封的个数n。接下来n行,每行两个整数
和
,代表信封的长度和宽度
。
输出包括一行,代表信封最多嵌套多少层。
9 3 4 2 3 4 5 1 3 2 2 3 6 1 2 3 2 2 4
4
从里到外分别是{1,2},{2,3},{3,4},{4,5}。 2 1 4 4 1
1
时间复杂度,空间复杂度
。
#include <stdio.h>
#include <stdlib.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
typedef struct {
int len;
int wid;
} Envelope;
int compare(void *v1, void *v2) {
Envelope *e1 = (Envelope *) v1;
Envelope *e2 = (Envelope *) v2;
return (e1->len != e2->len) ? (e1->len - e2->len) : (e2->wid - e1->wid);
}
int main(void) {
int n, len, wid;
scanf("%d", &n);
Envelope *envs = (Envelope *) malloc(sizeof(Envelope) * n);
Envelope e;
for (int i = 0; i < n; i++) {
scanf("%d %d", &len, &wid);
*(envs + i) = (Envelope) {len, wid};
}
qsort(envs, n, sizeof(Envelope), compare);
int *ends = (int *) malloc(sizeof(int) * n);
int right = 0, l, r, mid;
ends[0] = envs[0].wid;
for (int i = 1; i < n; i++) {
l = 0, r = right;
while (l <= r) {
mid = (l + r) >> 1;
if (ends[mid] < envs[i].wid) {
l = mid + 1;
} else {
r = mid - 1;
}
}
right = max(right, l);
ends[l] = envs[i].wid;
}
printf("%d\n", right + 1);
return 0;
}