贪心算法之最大不相交区间数问题

贪心算法之最大不相交区间数问题

数轴上有n个区间[ai,bi],要求选择尽量多个区间,使得这些区间两两没有公共点。

贪心策略:

按照b1<=b2<=b3…的方式排序,然后从前向后遍历,每当遇到可以加入集合的区间,就把它加入集合。(集合代表解的集合)

证明:

我们对a1,a2……的关系分以下几种情况考虑:

1、a1>a2。   此时区间2包含区间1。这种情况下显然不会选择区间2,因为选择区间1会留下更多的剩余空间。

                      不仅区间2如此,以后所有区间中只要有一个 i 满足a1 > ai,i 都不要选。

                      即此种情况下,选择区间1是明智的,与策略一致。

2、排除情况1后,一定有a1<=a2<=a3……。


题目描述:

学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入
第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)
输出
对于每一组输入,输出最多能够安排的活动数量。
每组的输出占一行
样例输入
2
2
1 10
10 11
3
1 10
10 11
11 20
样例输出
1
2
提示
注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始

AC代码:

 
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

class Range
{
	public:
		int left;
		int right;
		bool operator<(const Range& r)const
		{
			if(right<r.right)
				return true;
			else
				return false;
		}
};

int main(int argc,char *argv[])
{
	int i,n,m,end;
	vector<Range> r;
	int ans;
	scanf("%d",&m);
	while(m--)
	{
		ans=0;
		end=-1;
		r.clear();
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			Range temp;
			scanf("%d%d",&(temp.left),&(temp.right));
			r.push_back(temp);
		}
		sort(r.begin(),r.end());
		for(vector<Range>::iterator it=r.begin();it<r.end();it++)
		{
			if(end<(*it).left)
			{
				end=(*it).right;
				ans++;
			}
		}
		//printf("Case %d:\n",count);
		printf("%d\n",ans);
		//count++;
	}

	return 0;
}
        



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值