区间重合判断[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[];
for (i = ; i < ; i++)
trees[i] = true;
count = ;
cin >> L >> M;
for (i = ; i < M; i++){
cin >> start >> end;
while (start <= end){
trees[start] = false;
start++;
}
}
for (i = ; i <= L; i++)
if(trees[i] == true)
count++;
cout << count; return ;
}
如何马路长度L极大,比如40亿,以至于无法开设这么大的数组空间,此种解法就失效了。此时可以用解法2:先对区间按照开始时间start升序排列,然后当其他区间start小于初始区间(用temp表示)end时,表明这两个区间有重合,合并之(及修改temp.end)。由于按照区间起始start排序过了,只要start不小于初始区间end,则后面的区间就没有与初始区间重叠的区间了,此时将temp区间长度加到count上,并且将temp变为和前面区间无重叠的新区间,继续向下扫描。
解法2:区间合并
#include <stdio.h>
#include <stdlib.h>
#define M_MAX 100+1
typedef struct Area{
int start;
int end;
}Area; int CompareArea(const void *a, const void *b)
{
return ((Area *)a)->start - ((Area *)b)->start;
} int main()
{
Area area[M_MAX], temp;
int L, M, count = ;
scanf("%d%d", &L, &M);
for (int i = ; i < M; i++){
scanf("%d%d", &area[i].start, &area[i].end);
}
qsort(area, M, sizeof(Area), CompareArea); //区间按照开始时间升序排列 temp = area[];
for (int i = ; i < M; i++){
if (area[i].start <= temp.end){
if(area[i].end > temp.end)
temp.end = area[i].end;
}
else{
count += temp.end - temp.start + ;
temp = area[i];
}
}
count += temp.end - temp.start + ;
printf("%d", L+-count);
return ;
}
编程之美也有类似的这个题目,其实,种树问题本质是区间重合判断。
一,问题:
1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。
2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。
第一题源代码:
按照编程之美给出的提示。 先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,用二分查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在。(为什么可以二分法)
区间重合判断[poj2808 校门外的树]的更多相关文章
- 区间重合判断(pojg校门外的树)
pojg:http://poj.grids.cn/practice/2808 解法1:以空间换时间: #include<stdio.h> #include<string.h> ...
- OpenJudge计算概论-校门外的树
/*======================================================================== 校门外的树 总时间限制: 1000ms 内存限制: ...
- 【解题报告】VijosP1448校门外的树(困难版)
原题: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r ...
- C语言 · 校门外的树
算法提高 校门外的树 时间限制:1.0s 内存限制:256.0MB 问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- NC16649 [NOIP2005]校门外的树
NC16649 [NOIP2005]校门外的树 题目 题目描述 某校大门外长度为 \(L\) 的马路上有一排树,每两棵相邻的树之间的间隔都是 \(1\) 米.我们可以把马路看成一个数轴,马路的一端在数 ...
- P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...
- Vijos1448校门外的树 题解
Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...
- [swustoj 764] 校门外的树 Plus Plus
校门外的树 Plus Plus(0764) 问题描述 西南某科技大学的校门外长度为 L 的公路上有一排树,每两棵相邻的树之间的间隔都是 1 米.我们可以把马路看成一个数轴,马路的一端在数轴 1 的位置 ...
随机推荐
- java代码生成二维码
java代码生成二维码一般步骤 常用的是Google的Zxing来生成二维码,生成的一般步骤如下: 一.下载zxing-core的jar包: 二.需要创建一个MatrixToImageWriter类, ...
- 前端,基础选择器,嵌套关系.display属性,盒模型
基础选择器 1.统配选择器 控制html,body及body内跟显示相关的标签 *{ width:80px; height:80px; background-color:red; } 2.类选择器 以 ...
- boot_mem分配器
#define alloc_bootmem_low_pages(x) \ __alloc_bootmem_low(x, PAGE_SIZE, ) void * __init __alloc_bootm ...
- poj--2139
Description The cows have been making movies lately, so they are ready to play a variant of the famo ...
- bs4--官文--遍历文档树
遍历文档树 还拿”爱丽丝梦游仙境”的文档来做例子: html_doc = """ <html><head><title>The Dor ...
- URI URL URN 关系
我们一起来看下面这个虚构的例子.这是一个URI: http://bitpoetry.io/posts/hello.html#intro 我们开始分析 http:// 是定义如何访问资源的方式.另外 b ...
- Java设计模式学习三-----工厂模式
工厂模式 工厂模式(Factory Pattern)是Java中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻 ...
- 【java基础 7】java内存区域分析及常见异常
本篇博客,主要是读书笔记总结,还有就是结合培训分享的总结,没有太多的技术含量! java 的自动内存管理机制,使得程序员不用为每一个new惭怍的对象写配对的delete/ free代码(回想起C++的 ...
- 【C#】重写和重载的区别
导读:学习C#的时候,其实没想那么多的.就想着把视频看完,把例子做一下就好了,其实真心不懂那些玩意儿是什么,就好像是又回到了学VB的时候.可是,边上师哥压榨我这本就不聪明的脑袋瓜,问了我好多问题,于是 ...
- MySQL 待解决死锁
官方文档:https://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html 线上出现一个死锁现象,信息显示的是两条对同一个表的不同记录的upd ...