题目的分析被说得有点绕。自己理解是这样,首先由题目我们知道选择的区间都是相互不相交的,除这之外,我们的目标是尽量的让选择的区间达到最大化。

所以我们可以先对齐排序,因为输入是随机的。假设每个区间表示为(x,y)我们可以选择按照x排序所有区间,也可以选择按照y来排序所有区间。而不管选择哪一个来排序,其原理和本质都一样,都是为了方便操作,将其有序化。

我们这里选择按照y来排序,排序完后有y1 <= y2 <= y3.......

现在我们讨论x1 x2 ....

当x1 > x2时,区间被x2这个区间包含,所以选择x1这个区间更为划算。

而当x1 < x2时,当x2 > y1时,区间互不相交,先选x1区间,接着选x2区间

当x1 < x2 && x2 <=y1 时,两个区间相交,这时,如果选择了x2区间,就不能选择x1区间,反之亦然。

但要选择哪一个呢?我们知道如果不选x2也就是选x1,则我们此时把x1分成两半部分,一部分在x2内,如果选择了x2,x2区间不仅包含了x1的,还可能包含x3区间的,因为x2的长度肯定大于或等于x1区间的长度,也就是说从概率上讲,选x2肯定不如选x1划算。

综上所述:这个问题第一次一定要选择x1,接着就是把相交部分去掉,循环选不想交的。

#include <stdio.h>typedef struct zone{int x;int y;
}zone;
zone A[1000];
//快速排序接口
int partition(zone A[],int st,int ed){zone key = A[st];int j = st;for(int i = st + 1; i <= ed; i++){if(A[i].y <= key.y){j++;zone temp = A[i];A[i] = A[j];A[j] = temp;}}zone temp = A[j];A[j] = A[st];A[st] = temp;return j;
}
void quicksort(zone A[],int st,int ed){if(st < ed){int mid = partition(A,st,ed);quicksort(A,mid + 1,ed);quicksort(A,st,mid - 1);}}
//快速排序接口
#define MAXN 1000
int path[MAXN];
int main(){int n;while(scanf("%d",&n) != EOF){for(int i = 0 ; i < n; i++){scanf("%d%d",&A[i].x,&A[i].y);//input (x,y) } quicksort(A,0,n - 1);int len = 0,i = 1;zone key = A[0];path[len++] = 0;while(i < n){if(key.y < A[i].x){//true 则把A[i]拓展进来 path[len++] = i;key = A[i]; }   i++;}for(int i = 0; i < len; i++){printf("(%d,%d) ",A[path[i]].x,A[path[i]].y);}}return 0;
} 

转载于:https://www.cnblogs.com/sixcoder/archive/2013/04/05/3826017.html

选择不相交区间(贪心算法) By ACReaper相关推荐

  1. NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间

    会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...

  2. 贪心法——选择不相交区间

    贪心法--选择不相交区间 选择不相交区间.数轴上有nn个开区间(ai,bi)(a_i, b_i).选择尽量多个区间,使得这些区间两两没有公共点. 贪心思路:按b<script id=" ...

  3. 选择不相交区间(贪心:求不相交区间最多个数)

    选择不相交区间(转) 数轴上有n个区间[ai,bi],要求选择尽量多个区间,使得这些区间两两没有公共点. 贪心策略: 按照b1<=b2<=b3-的方式排序,然后从前向后遍历,每当遇到可以加 ...

  4. P1803 凌乱的yyy / 线段覆盖(选择不相交区间,贪心)

    题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...

  5. 简单区间问题 选择不相交区间 区间选点 区间覆盖问题解答及代码 C++

    1. 选择不相交区间 数轴上有n个开区间 ( a i , b i ) (a_i, b_i) (ai​,bi​).选择尽量多个区间,使得这些区间没有公共点. 这是最简单的区间问题,很多区间问题都需要先排 ...

  6. 贪心算法解决跳马问题_算法浅谈——怪盗基德的珠宝选择问题与贪心算法

    点击上方蓝字,和我一起学技术.   1   在开始今天的文章之前,我们先来讲一个故事: 在一个月黑风高的夜晚,怪盗基德潜入了一个著名的珠宝会馆.他面前有三个装着珠宝的柜子,这三个规则分别是A.B和C. ...

  7. 贪心算法——选择不相交区间问题

    题目描述:设有n个活动的集合,其中每个活动都要求使用同一个资源,而在同一时间内只有一个活动能够使用这一资源,每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi(si<fi),如果选 ...

  8. 区间贪心算法-——活动安排问题

    问题题目 设有n个活动的集合E={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间 ...

  9. 164. Leetcode 435. 无重叠区间 (贪心算法-贪心区间)

    class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if len(interval ...

最新文章

  1. INADDR_ANY 最好的解释
  2. GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...
  3. servlet之控制分发
  4. 微软Build 2018展示Visual Studio功能:跨系统云编程
  5. Linux中的【.】【./】【/】代表的含义【转载】
  6. sqlite:WAL模式
  7. 本地文件上传到阿里云生成网址
  8. EA建模-绘制活动图
  9. 谷歌浏览器设置关闭搜索记录
  10. ode45 matlab 出错,Matlab中ode45求解微分方程组出错。
  11. 【JPA/ddl-auto】关于JPA下hibernate通过设置ddl-auto完成数据库自动创建表格
  12. OCSP 在SSL证书中起什么作用
  13. vue单文件组件导入导出
  14. Linux系统磁盘空间不足解决办法
  15. 三七互娱后端工程师笔试记录
  16. 北京师范大学计算机考研难嘛,北京师范大学考研难吗?一般要什么水平才可以进入?...
  17. OC Extension Tangential(左右圆角)
  18. SystemUI的Plugin - 安卓R
  19. [个人笔记]HCIP-Routing Switching-IENP/H12-222
  20. C#中的延时函数sleep怎么使用

热门文章

  1. react 添加less预处理语言
  2. 重学java基础第二十三课:java基础 注释
  3. 前端学习(2890):如何短时间内实现v-for 模板编译321
  4. [css] CSS中的calc()有什么作用?
  5. 工作336:uni-ele-el-table修改宽度问题
  6. 前端学习(2812):前端小程序学习之小程序发展历史
  7. 前端学习(2755):配置tabber其他属性
  8. 前端学习(2377):项目初始化过程
  9. 前端学习(1707):前端系列javascript之promise
  10. 前端学习(484):html之实体