贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程不会影响以前的状态,只与当前状态有关。)
所以,对所采用的贪心策略一定要仔细分析其是否满足无后效性。
解题的一般步骤是:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解
分析题目,该题是一个贪心算法,我们应该先建立好数学模型,有三个思路:
1.先找开始时间最早的
2.先找持续时间最短的
3.先找结束时间最早的
通过分析,第一种当结束时间晚时,得不到最优解,第二种,刚好持续时间短的与其他时间重叠过多得不到最优解,通过数学归纳法可知,第三种可行,每次选结束时间最早的,为后面的选择留下更多的时间,由局部最优解得到全局最优解。
#include<stdio.h>
int main()
{
int n,Ti_s[100],Ti_e[100];
int i,k,j;
int temp;
int sum=0;
while(scanf("%d",&n)&&n)
{
for(i=0;i<=n-1;i++)
{
scanf("%d%d",&Ti_s[i],&Ti_e[i]);
}
for(i=0;i<n-1;i++)
{
k=i;
temp=Ti_e[i];
for(j=i+1;j<n;j++)
{
if(temp>Ti_e[j])
{
temp=Ti_e[j];
k=j;
}
}
temp=Ti_e[i];
Ti_e[i]=Ti_e[k];
Ti_e[k]=temp;
temp=Ti_s[i];
Ti_s[i]=Ti_s[k];
Ti_s[k]=temp;
}
temp=Ti_e[0];
sum=1;
for(i=1;i<=n-1;i++)
{
if(Ti_s[i]>=temp)
{
temp=Ti_e[i];
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}