编程之美——区间重合判断

将源区间按照x坐标大小排序,然后进行合并,使用二分查找目标区间x,y坐标在源区间中的分布,若两者分布于同一连续区间,则区间重合

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4
 5 struct section
 6 {
 7     int low;
 8     int high;
 9     bool operator<(const section &l)const
10     {
11         return low<l.low;
12     }
13 };
14
15 int getIndex(int num);
16
17 const int N=1001;
18 section source[N];
19 const int K=101;
20 section des[K];
21 //源区间合并后段数
22 int ncnt=0;
23
24 int main()
25 {
26     //n:源区间个数 k:目标区间个数
27     int n,k;
28     cin>>n>>k;
29     for(int i=0;i<n;++i)
30         cin>>source[i].low>>source[i].high;
31     for(int i=0;i<k;++i)
32         cin>>des[i].low>>des[i].high;
33
34     sort(source,source+n);
35
36     int highnum=source[0].high;
37     for(int i=1;i<n;++i)
38         if(source[i].low<=highnum)
39         {
40             //处理[1,6] [2,5]查[2,6]这种情况
41             if(source[i].high<highnum)
42                 continue;
43             else
44                 highnum=source[i].high;
45         }
46         else
47         {
48             source[ncnt++].high=highnum;
49             source[ncnt].low=source[i].low;
50             highnum=source[i].high;
51         }
52     source[ncnt++].high=highnum;
53
54     for(int i=0;i<k;++i)
55     {
56         int indexlow=getIndex(des[i].low);
57         int indexhigh=getIndex(des[i].high);
58         if(indexlow==indexhigh&&indexlow!=-1&&des[i].high<source[indexhigh].high)
59             cout<<"the "<<i+1<<" section is match"<<endl;
60         else
61             cout<<"the "<<i+1<<" section is not match"<<endl;
62     }
63
64     return 0;
65 }
66
67 int getIndex(int num)
68 {
69     if(num<source[0].low||num>source[ncnt-1].high)
70         return -1;
71     int u=0;
72     int v=ncnt-1;
73     while(u<=v)
74     {
75         int m=(u+v)>>1;
76         if(num>=source[m].low)
77             u=m+1;
78         else
79             v=m-1;
80     }
81
82     return v;
83 }

时间: 2024-08-10 03:24:15

编程之美——区间重合判断的相关文章

【编程之美】2.19 区间重合判断

题目: 给定一个目标区间[x,y]和N个无序的源区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内. 思路:把源区间按x从小到大排序,再把区间依次合并,每完整得到一个合并区间后,判断[x,y]是否在合并区间内. #include <stdio.h> #include <stdlib.h> typedef struct { int x; int y; }Region; int cmp(const void * a, const void

区间重合判断[poj2808 校门外的树]

题目:http://bailian.openjudge.cn/practice/2808/ 参考了文章,重写了代码:http://www.cnblogs.com/youxin/p/3266617.html(注:原文解法2代码有误) 解法1:以空间换时间 #include <iostream> using namespace std; int main() { int L, M, i, start, end, count; bool trees[10001]; for (i = 0; i <

第2章 数字之魅——区间重合判断

区间重合判断 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter2shuzizhimei.qujianchonghe; 2 /** 3 * 区间重合判断 4 * @author DELL 5 * 6 */ 7 public class IntervalOverlap { 8 //区间类 9 public static class Interval{ 10 public double x; //区间左端点 11 public double y; //区间右端点 1

【编程之美】区间重合判断

给定一个源区间[x,y](y>=x)和N个无序的目标区间[x1,y1] [x2,y2] [x3,y3] [xn,yn],判断源区间[x,y]是不是在目标区间内? 例如:给定源区间[1,6]和一组无序的目标区间[2,3] [1,2] [3,9],即可认为区间[1,6]在区间[2,3] [1,2] [3,9]内(因为目标区间实际上是[1,9]). 分析与解法 方法一:直接法 一个比较直接的思路即将源区间和目标区间逐个投影到坐标轴上,只考察源区间未被覆盖的部分.如果所有的区间全部投影完毕,仍然有源区间

[算法]区间重合判断

题目描述: 给定一个源区间 [x,y]和N个无序的目标区间[x1,y1],[x2,y2],...[xn,y,],判断给定的源区间[x,y]在不在目标区间内. 例如:给定源区间[1 6]和目标区间[1 2][2 4][4 9]即可认为区间[1 6]在目标区间内,因为源区间的并集为[1 9 ]. 试想一下,现在在这样的一个目标区间的集合, 需要频繁地去查询一个区间是否在该集合中.那么怎么样才能降低单次查询的复 杂度呢.预处理.对区间的预处理可以满足这样的需求. 直接上方法: 第一步: 首先对区间进行

2.19 区间重合判断

问题: 1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内. 2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖. 1. 解法: 先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,用二分查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在. 代码: #

【编程之美】目录

第1章  游戏之乐——游戏中碰到的题目 1.1 让CPU占用率听你的指挥 1.2 中国象棋将帅问题 1.3 一摞烙饼的排序 1.4 买书问题 第2章  数字之魅——数字中的技巧 2.1 求二进制中1的个数 2.2 不要被阶乘吓倒 2.3 寻找发帖"水王" 2.4 1的数目 2.5 寻找最大的K个数 2.6 精确表达浮点数 2.7 最大公约数问题 2.8 找符合条件的整数 2.9 斐波那契(Fibonacci)数列 2.10 寻找数组中的最大值和最小值 2.11 寻找最近点对 2.12

编程之美需整理的题目汇总

2.1 求二进制中1的个数. 2.2 求n!末尾有多少个0 和 求n!的二进制表示中最低位1的位置. 2.3 找出数量超过总数一半的记录. 扩展:3个发帖都超过了总数N的1/4. 2.4 十进制1~N 所有整数中1的个数: 满足F(N)=N的最大的N是多少. 扩展:CC上所有2的个数. 2.5 寻找最大的k的个数. 2.6 精确表达浮点数 2.7 最大公约数问题. 2.8 任意给定一个正整数N,求一个最小的正整数M(M>1),似的N*M的十进制表示形式里只有1和0. 2.9 Fibonacci

《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明

先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 为了防止剧透使得没看过原题目的读者丧失思考的乐趣,我把最好的解法隐藏起来.由于这个问题本身的解答并不是本文的重点,扩展问题也采用这种形式呈现. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/article/details/6447013,作者v_JULY_v. 用指针p1.p2分别指向两个链表头,不断后移:最后到达各自表尾时,若p1==p2,那么两个链表必相交 用