活动选择问题
Problem Description
sdut 大学生艺术中心每天都有n个活动申请举办,但是为了举办更多的活动,必须要放弃一些活动,求出每天最多能举办多少活动。
Input
输入包括多组输入,每组输入第一行为申请的活动数n(n<100),从第2行到n+1行,每行两个数,是每个活动的开始时间b,结束时间e;
Output
输出每天最多能举办的活动数。
Example Input
12 15 20 15 19 8 18 10 15 4 14 6 12 5 10 2 9 3 8 0 7 3 4 1 3
Example Output
5
#include<stdio.h> int main() { int n,i,j,a[50][5],t,c,e; while(scanf("%d",&n)!=EOF) { e=1; /*保证最后比较没找最优问题的解时,只有一场*/ for(i=1; i<=n; i++) for(j=1; j<=2; j++) scanf("%d",&a[i][j]); for(i=1; i<n; i++) for(j=i+1; j<=n; j++) { if(a[i][2]>a[j][2]) { t=a[i][2]; a[i][2]=a[j][2]; a[j][2]=t; t=a[i][1]; a[i][1]=a[j][1]; a[j][1]=t; } } i=1; /*从第一场开始*/ while(i!=n) { c=0; for(j=i+1; j<=n; j++) { if(a[j][1]>=a[i][2]) { c=1; i=j; //下一次筛选从当前位置开始 e++; break; } } if(c==0) break; //没有解,跳出循环 } printf("%d\n",e); } return 0; }
活动选择问题:
选择活动时间结束时间较早的。将每场的活动结束时间从小到大排列出来,从第一场开始。判断活动结束与开始的时间,当下一场的活动的开始时间比前一场的活动结束的早或正好相等时即找到最优局部解。将比较的起点重新放在当前位置,进行接下来的比较筛选。