一、问题
问题描述:
有n项活动申请使用同一个地点,每项活动有一个开始时间和一个截止时间。如果任何两项活动不能同时举行,问如何选择这些活动,从而使得被安排的活动数量达到最多。
问题建模:
设S为活动的集合,s和f分别为活动的开始和截止时间。
定义:活动i和j相容。求S最大的两两相容的活动子集A。
把活动按照截止时间从小到大排序,使得f1<=f2<=…<=fn,然后从前往后挑选,只要和前面选的活动内容相容,就把这项活动选入A。
二、解析
把活动按照截止时间从小到大排序,用一个flag记录活动是否能入选。记录前一次结束的时间从前往后挑选,如果开始时间在前一次结束之后就把flag记为true,否则是false。最后找到flag为true的就是入选的活动了。
三、设计
void Greedy(int n){
S a[n+1];
for (int i = 1; i <= n; i++)