贪心入门2(活动安排问题)

题目:

http://www.51nod.com/tutorial/course.html#!courseId=14

解题思路:

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);    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值