基于贪心算法对整数区间问题(CEOI1997)的深入研究

题目

题目描述

请编程完成以下任务:

1.从文件中读取闭区间的个数及它们的描述;

2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。

输入

首行包括区间的数目n,1≤n≤10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0≤a≤b≤10000,它们是某一个区间的开始值和结束值。

输出

第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少。

样例输入

4
3 6
2 4
0 2
4 7

样例输出

2

算法分析

这是CEOI(中欧信息学竞赛)1997的一道题,仔细想想应该不难知道应该用贪心去做。
我就看门见山地讲吧!

先将每个区间的右端点排一下序(从小到大),从小到大地对每个区间进行处理,对于每一个区间,它的右端点在数轴上肯定在上一个区间的右侧(因为我们是从小到大排的序的呀!),那要让我们答案集合中的元素尽量少,那就选它上一个区间的右端点作为答案集合的一个元素(这就是这道题的贪心之处),于是就会有两种情况。

  1. 当前我们处理的区间的左端点比它的上一个区间的右端点要大。(如下图)在这里插入图片描述
    此时我们无法让一个整数属于这两个集合,于是我们就得增加一个整数
  2. 另外一种情况就是当前我们处理的区间的左端点小于等于它上一个区间的右端点在这里插入图片描述
    此时我们就可以让图中红色的点属于这两个集合,也就不用增加整数了(现在懂了为什么本题的贪心是让答案集合中的整数为区间的右端点了吧!其实就是让一个整数属于尽量多的集合,以达到减少其数量的目的。)

好了,看看代码吧!</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值