算法概述:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
问题概述:
学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始。
Input
每组测试数据的第一行是一个整数n ( 1 < n < 10000 )表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi , Ei ( 0 <= Bi , Ei < 10000 ),分别表示第i个活动的起始与结束时间( Bi <= Ei )
Output
对于每一组输入,输出最多能够安排的活动数量
Sample Input
3
1 10
10 11
11 20
Sample Output
2
问题分析
这样的题目,我们要在一定的时间内实现最多的活动,也就是说我们要让这一段时间更加的“满”,所以,我们的策略是按照每个活动结束时间来把每个活动从结束早到结束晚来排序(我是用快速排序法实现),然后一个一个判断过去。
代码实现:
#include<stdio.h>
int t;
int activity_selector();
void quicksort(int left,int right);
//定义一个结构体,把每个活动的结束时间和开始时间存入
struct note
{
int start;
int end;
}q[10000];
int main()
{
int res,i;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d%d",&q[i].start,&q[i].end);
}
quicksort(1,t);
res=activity_selector();
printf("%d\n",res);
}
void quicksort(int left,int right)//快速排序法
{
int temp=q[left].end;
int temp1=q[left].start;
int i,j,t,f;
i=left;
j=right;
if(right<left)
{
return;
}
while(i!=j)
{
while(i<j && q[j].end>=temp)
{
j--;
}
while(i<j && q[i].end<=temp)
{
i++;
}
if(i<j)
{
t=q[i].end;
q[i].end=q[j].end;
q[j].end=t;
f=q[i].start;
q[i].start=q[j].start;
q[j].start=f;
}
}
q[left].end=q[i].end;
q[i].end=temp;
q[left].start=q[i].start;
q[i].start=temp1;
quicksort(left,i-1);
quicksort(i+1,right);
}
int activity_selector()//用来算出可以安排的活动数量
{
int num=1,i=1;
int j;
for(j=2;j<=t;j++)
{
if(q[j].start>q[i].end)
{
i=j;
num++;
}
}
return num;
}