最大不重叠区间

http://zju.acmclub.com/index.php?

app=problem_title&id=1&problem_id=1126

RT,给定n个区间。每一个区间有開始时间si和结束时间ei,

问在数轴上怎样摆放能使在没有重叠区间的情况下区间数目达到最大?

分析:典型的贪心思路。在《算法导论》贪心那一章的第一个样例即是它——活动选择问题

解法:按区间的结束时间从小到大排序后。从小的区间按顺序选取;

(1)假设当前区间与已经覆盖的位置重叠(与当前最右位置进行比較)。则舍弃;

(2)否则将此区间摆放在数轴上并更新当前已经覆盖的最右位置

cpp代码:

#include<iostream>
using namespace std;
int main(){
    struct SEGMENT{
        int x;
        int y;
    };
    int n,si,ei,pos,k,tmp,i,cur;
    struct SEGMENT seg[101];
    while(cin>>n){
        pos = 0;
        if(n==0)break;
        while(n--){
            cin>>si>>ei;
            seg[pos].x=si;
            seg[pos].y=ei;
            pos++;
        }
        //BubbleSort
        for(k=1;k<pos;k++){
            for(i=0;i<pos-k;i++){
                if(seg[i].y>seg[i+1].y){
                    //swap
                    tmp=seg[i+1].y;
                    seg[i+1].y=seg[i].y;
                    seg[i].y=tmp;
                    tmp=seg[i+1].x;
                    seg[i+1].x=seg[i].x;
                    seg[i].x=tmp;
                }
            }
        }
        //main process
        cur=seg[0].y;
        int cnt=1;
        for(k=1;k<pos;k++){
            if(seg[k].x>=cur){
                cur=seg[k].y;
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}
时间: 2024-11-05 02:38:55

最大不重叠区间的相关文章

求重叠区间个数,某书某题错例分析

大意就是我淘钱买了一本题集,觉得书中有些地方作者太随意,例子错得不严谨,一度阻碍阅读.作为消费者不得不拿出来说一说.本文本着不迷信,实事求是精神.本文编排如下:1.引用书中原例2.主观分析例子有错3.代码运行验证其错4.修正例子代码5.另一个求值代码现在开始. 下面是书中原例引用: 求重叠区间个数 给定多个可能重叠的区间,找出重叠区间的个数.区间定义如下: class Interval { int start; // 起点 int end; // 止点 Interval(int a, intb)

算法练习:重叠区间个数

一.题目描述 给定多个可能重叠的区间,找出重叠区间的个数. 举例如下: 输入:[1,5],[10,15],[5,10],[20,30] 输出:2 说明:题意应该是找出重叠区间中区间的最大个数,当没有区间重叠时,重叠个数最大为1,比如 输入为:[1,5],[10,15],则输出为1: 输入为:[1,2],[2,3],[3,4],[4,5],则输出为2(重叠区间相互之间都要有交集): 输入为:[1,7],[2,5],[3,4],[8,15],[9,17],[20,25],则输出为3. 二.题目分析

LeetCode——无重叠区间

Q:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互"接触",但没有相互重叠. 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠. 示例 2: 输入: [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠. 示例 3:

Spoj 2916 Can you answer these queries V 线段树 求任意重叠区间的最大子段和

题目链接:点击打开链接 题意: T个测试数据 n个数字 q个询问 每个询问 : [x1, y1] [x2, y2] 问: int ans = -inf; for(int i = x1; i <= y1; i++) for(int j = max(x2, i); j <= y2; j++) ans = max(ans, query(i, j)); 思路: query_L(int l, int r) 求的是在区间[l,r]内 ,左端点为l的最大子段和. 其他和GSS3差不多. 分类讨论一下给定的区

区间调度问题

1. 相关定义 在数学里,区间通常是指这样的一类实数集合:如果x和y是两个在集合里的数,那么,任何x和y之间的数也属于该集合.区间有开闭之分,例如(1,2)和[1,2]的表示范围不同,后者包含整数1和2. 在程序世界,区间的概念和数学里没有区别,但是往往有具体的含义,例如时间区间,工资区间或者音乐中音符的开始结束区间等,图一给出了一个时间区间的例子.区间有了具体的含义之后,开闭的概念就显得非常重要,例如时间区间[8:30,9:30]和[9:30,10:30]两个区间是有重叠的,但是[8:30,9

[Leetcode] merge intervals 合并区间

Given a collection of intervals, merge all overlapping intervals. For example,Given[1,3],[2,6],[8,10],[15,18],return[1,6],[8,10],[15,18]. 题意:给定一系列区间,合并重叠区间 思路:其实,个人觉得,题目的例子有一定误导性,以为区间已经按每个区间的start值排好序了.结果,毫无疑问,悲剧了.若是已经排好序,则,只需将当前区间的end值和下一个的start值比较,

Leetcode 56. 合并区间

给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间 思路:按start排序一下,然后遍历比较区间.会有两种情况:1:interval.start <=this_int

【LeetCode】数组--合并区间(56)

写在前面   老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据.在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构. 贪心算法回顾: [LeetCode]贪心算法--买卖股票的最佳时机II(122) [LeetC

【LeetCode】56-合并区间

题目描述 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间. 解题思路 定义一个比较器,按照区间的起始值排序 使用上述比较器对区间集合进行排序 遍历区间集合,使用一