活动安排问题



活动安排
描述:
设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si
输入:
输入只有一个用例,第一行为一正整数n,表示活动个数,接下来n行,每行两个整数,分别表示第i号活动的起始时间和结束时间。
输出:
用一行输出所能安排的最多活动数。
样例输入:
11
5 9
0 6
12 14
8 12
1 4
3 5
5 7
3 8
6 10
8 11
2 13
样例输出:
4

题解:采用的是贪心算法。现将所有活动的结束时间排序,这样安排活动是最多的。

AC code:

#include <iostream>
#include <algorithm>
using namespace std;
struct Act
{
	int start,end;
};
bool cmp(Act a,Act b)
{
	if(a.end!=b.end)
		return a.end<b.end;
	else
		return a.start<b.start;
}
int main()
{
	int n,i;
	Act *a;
	while(cin>>n)
	{
      a = new Act[n];
      for(i=0; i<n; i++)
	  {
		  cin>>a[i].start>>a[i].end;
	  }
	  sort(a,a+n,cmp);
	  int sum=1,pre=0;
	  for(i=1; i<n; i++)
	  {
		 if(a[i].start>=a[pre].end)
		 {
			 sum++;
			 pre = i;
		 }
	  }
	  cout<<sum<<endl;
	  delete [] a;
    }
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值