活动安排
描述 给定n个活动,每个活动安排的时间为[Ai, Bi]。求最多可以选择多少个活动,满足选择的活动时间两两之间没有重合。 输入描述: 第一行输入一个整数 1≤n≤100000 表示可选活动个数。 接下来的n行,每行输入两个整数Ai,Bi,0<= Ai<Bi<= 1000000000,表示第i个活动的时间。 输出描述: 输出一行一个整数,表示最多可选择的活动数,使用C语言实现
#include <stdio.h> #include <stdlib.h> typedef struct { int start; int end; } actv_t; int cmpr(const void *a, const void *b) { const actv_t *A = (const actv_t *)a; const actv_t *B = (const actv_t *)b; if (A->end < B->end) return -1; if (A->end > B->end) return 1; return 0; } int main(void) { int n; if (scanf("%d", &n) != 1 || n < 0) { printf("0\n"); return 0; } if (n == 0) { printf("0\n"); return 0; } // 使用动态内存分配 actv_t *activities = (actv_t *)malloc(n * sizeof(actv_t)); if (activities == NULL) { printf("内存分配失败\n"); return 1; } for (int i = 0; i < n; i++) { if (scanf("%d %d", &activities[i].start, &activities[i].end) != 2) { printf("输入格式错误\n"); free(activities); return 1; } } qsort(activities, n, sizeof(actv_t), cmpr);//入参需要特别注意, int count = 1; int last_end = activities[0].end; for (int i = 1; i < n; i++) { if (activities[i].start >= last_end) { count++; last_end = activities[i].end; } } printf("%d\n", count); free(activities); return 0; }