事件序列问题(贪心算法)

Problem Description

已知N=12个事件的发生时刻和结束时刻(下表,并已按结束时刻升序排序)。一些在时间上没有重叠的事件可以构成一个事件序列,如{2,8,10},事件序列包含的事件数目,称为该事件序列的长度。编程找出一个最长的事件序列。

Input Description

第一行输入一个整数0<N<1000,表示事件的数量。
接下来输入N行,输入两个数begin[i],end[i],分别表示时间的发生时刻与结束时刻,0<=i<N。

Output Description

输出最长的时间序列。

Sample Input

12
1 3
3 4
0 7
3 8
2 9
5 10
6 12
4 14
10 15
8 18
15 19
15 20

Sample Output

{0,1,5,8,10}

个人分析:

1.解决该问题的方法思想就是贪心算法,题目规定了每次给出的数据已按结束时刻升序排序,故我们仅需要进行选择即可。

2.每次选择都选择时间段结束最早的,只有结束时间最早,才为后面的活动安排留出更多的时间,这样选择的数量才是最多的。

#include<stdio.h>

int main()
{
  int n;
  scanf("%d", &n);
  int begin[n], end[n];
  for(int i = 0; i < n; i++)
  {
      scanf("%d %d", &begin[i], &end[i]);
  }
  int take[n];
  for(int i = 0; i < n; i++)
  {
      take[i] = 0;
  }
  int i = 0;
  int time = 0;
  while(i < n)
  {
      if(begin[i] >= time)
      {
          take[i] = 1;
          time = end[i];
      }
      i++;
  }
  printf("{");
  int flag = 0;
  for(int i = 0; i < n; i++)
  {
      if(take[i] == 1)
      {
          if(flag == 0)
          {
             printf("%d", i);
             flag = 1;
          }
          else if(flag == 1)
          {
            printf(",%d", i);
          }
      }
  }
  printf("}\n");
  return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值