列表

详情


CMB26. 挑选代表

描述

我们有很多区域,每个区域都是从a到b的闭区间,现在我们要从每个区间中挑选至少2个数,那么最少挑选多少个?

输入描述

第一行是N(N<10000),表示有N个区间,之间可以重复
然后每一行是ai,bi,持续N行,表示现在区间。均小于100000

输出描述

输出一个数,代表最少选取数量。

示例1

输入:

4
4 7
2 4
0 2
3 6

输出:

4

原站题解

C 解法, 执行用时: 3ms, 内存消耗: 364KB, 提交时间: 2020-04-18

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXV 10005
typedef struct area {
    int x, y;
} Area;
Area a[MAXV];
int cmp(const void *a, const void *b) {
    Area *x = (Area*)a;
    Area *y = (Area*)b;
    if(x->y != y->y)
        return x->y - y->y;
    else
        return x->x - y->x;
}
 
int main() {
    //freopen("input.txt", "r", stdin);
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d%d", &a[i].x, &a[i].y);
    qsort(a,n,sizeof(a[0]),cmp);
    int sum=2,lastr=a[0].y;
    for(int i=1;i<n;i++){
        if(a[i].x>lastr){
            sum+=2;
            lastr=a[i].y;
        }else if(a[i].x==lastr){
            sum+=1;
            lastr=a[i].y;
        }
    }
    printf("%d",sum );
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 372KB, 提交时间: 2020-07-28

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXV 10005
typedef struct area {
    int x, y;
} Area;
Area a[MAXV];
int cmp(const void *a, const void *b) {
    Area *x = (Area*)a;
    Area *y = (Area*)b;
    if(x->y != y->y)
        return x->y - y->y;
    else
        return x->x - y->x;
}
  
int main() {
    //freopen("input.txt", "r", stdin);
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d%d", &a[i].x, &a[i].y);
    qsort(a,n,sizeof(a[0]),cmp);
    int sum=2,lastr=a[0].y;
    for(int i=1;i<n;i++){
        if(a[i].x>lastr){
            sum+=2;
            lastr=a[i].y;
        }else if(a[i].x==lastr){
            sum+=1;
            lastr=a[i].y;
        }
    }
    printf("%d",sum );
    return 0;
}

上一题