题目:
任务描述
学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入格式
第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
输出格式
输出安排的最多的活动数
输入样例
11
1 4
3 6
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
输出样例
4
解题思路:
- 该题是贪心算法的衍生应用,按格式将活动的起始时间分别存入a,b两个数组当中;
- 调用安排函数,我们用一个title数组存储分别以1-n活动为起始活动计算的最多活动安排数;
- 然后我们以活动一必须被安排上为例,将活动二、三...的起始时间与活动的结束时间作比较,直到找到起始时间大于活动一结束时间的活动,这时就需要将该活动的结束时间做为参考标准再与其他的活动作比较,直到比较完所有数组。即可找到以活动一为必举办活动的最多活动举行数;
- 如果不考虑优化,我们就可以直接按照活动一必选来计最多举办活动数。
不考虑优化:
#include "stdio.h" #define N 1000 bool flag[N]; void ArrageMax(int n,int a[],int b[]); int main(){ int n,m; m=scanf("%d",&n); if(n<=1||n>=10000){ scanf("%d",&n); } //判断非法输入 int a[N],b[N]; for(int i=0;i<n;i++){ scanf("%d %d",&a[i],&b[i]); //按格式输入活动的起始结束时间 } ArrageMax(n,a,b); //调用安排函数 return 0; } void ArrageMax(int n,int a[],int b[]){ int title=1; flag[0]=true; int j=0; for(int i=1;i<n;i++){ if(a[i]>=b[j]){ //如果所选的起始时间大于所选的结束时间 title++; //举办活动数加一 flag[i]=true; j=i; //下一次比较以这一次比较的活动的结束时间为准 } } printf("安排的最多的活动数:"); printf("%d\n",title); printf("安排的活动为:"); for(int k=0;k<n;k++){ if(flag[k]==true){ printf("%d ",k+1); } } }
考虑优化:
#include "stdio.h" #define N 1000 void ArrageMax(int n,int a[],int b[]); int main(){ int n,m; m=scanf("%d",&n); if(n<=1||n>=10000){ scanf("%d",&n); } //判断非法输入 int a[N],b[N]; for(int i=0;i<n;i++){ scanf("%d %d",&a[i],&b[i]); //按格式输入活动的起始结束时间 } ArrageMax(n,a,b); //调用安排函数 return 0; } void ArrageMax(int n,int a[],int b[]){ int title[N],max=0; //定义存储最大举办活动数的数组 for(int i=0;i<n;i++){ title[i]=1; //将数组初始化为1,所有都有一个默认必选活动 } for(int k=0;k<n;k++){ int j=k; for(int i=k+1;i<n;i++){ if(a[i]>=b[j]){ //如果所选的起始时间大于所选的结束时间 title[k]++; //举办活动数加一 j=i; //下一次比较以这一次比较的活动的结束时间为准 } } } for(int i=0;i<n;i++){ //找出所有情况下的最大举办活动数 if(title[i]>max){ max=title[i]; } } printf("%d",max); }