首页 > 试题广场 >

信封嵌套问题

[编程题]信封嵌套问题
  • 热度指数:2369 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给n个信封的长度和宽度。如果信封A的长和宽都小于信封B,那么信封A可以放到信封B里,请求出信封最多可以嵌套多少层。

输入描述:
输出包含多行,第一行包括一个整数,代表信封的个数n。接下来n行,每行两个整数l_iw_i,代表信封的长度和宽度


输出描述:
输出包括一行,代表信封最多嵌套多少层。
示例1

输入

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

输入

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;
}

发表于 2022-01-28 15:36:10 回复(0)

问题信息

上传者:小小
难度:
1条回答 5604浏览

热门推荐

通过挑战的用户

查看代码