CMB26. 挑选代表
描述
我们有很多区域,每个区域都是从a到b的闭区间,现在我们要从每个区间中挑选至少2个数,那么最少挑选多少个?输入描述
第一行是N(N<10000),表示有N个区间,之间可以重复输出描述
输出一个数,代表最少选取数量。示例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; }