题目:
解题思路:
1: 因为本题是求在时间不冲突的情况下,一个房间内能安排活动最多的次数。
2:4种不同的策略:
(1) 开始最早的活动优先,目标是想尽早结束活动,让出教室。
(2) 短活动优先, 目标也是尽量空出教室。
(3) 最少冲突的活动优先,
(4) 结束时间越早的活动优先。
又因为对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。所以证明很重要,在上面题的地址里有上面4种策略的证明。
3:最终第四种的策略是正确的。
心得
贪心算法是很常见的算法之一,这是由于它简单易行,构造贪心策略简单。但是,它需要证明后才能真正运用到题目的算法中。一般来说,贪心算法的证明围绕着整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
代码:
# include <stdio.h>
void sort(int a[][2], int, int );
int main(void)
{
int i,j,n,m=1;
scanf("%d",&n);
int a[n][2];
for(i = 0; i<n; i++)
{
for(j = 0; j<2; j++)
{
scanf("%d",&a[i][j]);
}
}
sort(a, 0, n-1);//按照每一个活动最晚时间进行由小到大排序
int t = a[0][1];
for(i = 1; i<n; i++)
{
if(a[i][0] >= t )//如果一个活动的开始时间大于上一个活动的结束时间那么就加1
{
m+=1;
t = a[i][1];
}
}
printf("%d",m);
return 0;
}
void sort(int a[][2], int left, int right)
{
if(left>=right)
return ;
int i = left;
int j = right;
int key = a[i][1];
int key2 = a[i][0];
while(i<j)
{
while(i<j && key <= a[j][1]) j--;
a[i][0] = a[j][0];
a[i][1] = a[j][1];
while(i<j && key >= a[i][1]) i++;
a[j][0] = a[i][0];
a[j][1] = a[i][1];
}
a[i][1] =key;
a[i][0] = key2;
sort(a, left, i-1);
sort(a, i+1, right);
}