输出包含多行,第一行包括一个整数,代表信封的个数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; }