贪心算法:7-6 Swan学院社团招新
Swan学院社团招新,招新宣讲会分散在不同时间段,大一新生小花花想知道自己最多能完整的参加多少个招新宣讲会(参加一个招新宣讲会的时候不能中断或离开)。 【问题说明】这个问题是对几个相互竞争的招新宣讲会活动进行调度,它们都要求以独占的方式使用某一公共资源(小花花)。调度的目标是找出一个最大的相互兼容的活动集合。 活动选择问题就是要选择出一个由互相兼容的问题组成的最大子集合。 【温馨提示】应先将所有的活动按照结束时间升序排列,然后再选择可能的时间组合,并求出最大的组合数,使用qsort()排序函数是一个不错的选择。qsort 的函数原型是: void qsort(voidbase,size_t num,size_t width,int(__cdeclcompare)(const void,const void)); 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 参数: 1 待排序数组首地址;2 数组中待排序元素数量;3 各元素的占用空间大小;4 指向函数的指针,用于确定排序的顺序
输入格式:
第一行为n,表示有n个招新宣讲会,接下来n行每行两个整数表示开始时间和结束时间,由从招新会第一天0点开始的小时数表示(24小时制)。 n <= 1000 。
输出格式:
最多参加的招聘会个数。
输入样例:
在这里给出一组输入。例如:
3
9 10
10 20
8 15
输出样例:
在这里给出相应的输出。例如:
2
思路:先按照结束时间排序排序,结束越早的排在越前边,然后根据活动的开始和结束时间进行比较后在计算
#include<stdio.h> #include<stdlib.h> struct act { int start; int end; }; struct act activity[1000]; int cmp(const void* a, const void* b) { struct act xx = *(struct act*)a; struct act yy = *(struct act*)b; return xx.end - yy.end; } int main(void) { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d %d", &activity[i].start,&activity[i].end); } qsort(activity, n, sizeof(activity[0]), cmp); /*printf("\n"); for (int i = 0; i < n; i++) { printf("%d %d\n", activity[i].start, activity[i].end); } printf("\n");*/ int endtime = activity[0].end; int ans = 1; for (int i = 1; i < n; i++) { if (endtime <= activity[i].start) { ans++; endtime = activity[i].end; } } printf("%d", ans); return 0; }