选择不相交区间(贪心算法) By ACReaper
题目的分析被说得有点绕。自己理解是这样,首先由题目我们知道选择的区间都是相互不相交的,除这之外,我们的目标是尽量的让选择的区间达到最大化。
所以我们可以先对齐排序,因为输入是随机的。假设每个区间表示为(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相关推荐
- NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...
- 贪心法——选择不相交区间
贪心法--选择不相交区间 选择不相交区间.数轴上有nn个开区间(ai,bi)(a_i, b_i).选择尽量多个区间,使得这些区间两两没有公共点. 贪心思路:按b<script id=" ...
- 选择不相交区间(贪心:求不相交区间最多个数)
选择不相交区间(转) 数轴上有n个区间[ai,bi],要求选择尽量多个区间,使得这些区间两两没有公共点. 贪心策略: 按照b1<=b2<=b3-的方式排序,然后从前向后遍历,每当遇到可以加 ...
- P1803 凌乱的yyy / 线段覆盖(选择不相交区间,贪心)
题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加几个比赛. 由于yyy是蒟蒻,如果要参加 ...
- 简单区间问题 选择不相交区间 区间选点 区间覆盖问题解答及代码 C++
1. 选择不相交区间 数轴上有n个开区间 ( a i , b i ) (a_i, b_i) (ai,bi).选择尽量多个区间,使得这些区间没有公共点. 这是最简单的区间问题,很多区间问题都需要先排 ...
- 贪心算法解决跳马问题_算法浅谈——怪盗基德的珠宝选择问题与贪心算法
点击上方蓝字,和我一起学技术. 1 在开始今天的文章之前,我们先来讲一个故事: 在一个月黑风高的夜晚,怪盗基德潜入了一个著名的珠宝会馆.他面前有三个装着珠宝的柜子,这三个规则分别是A.B和C. ...
- 贪心算法——选择不相交区间问题
题目描述:设有n个活动的集合,其中每个活动都要求使用同一个资源,而在同一时间内只有一个活动能够使用这一资源,每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi(si<fi),如果选 ...
- 区间贪心算法-——活动安排问题
问题题目 设有n个活动的集合E={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间 ...
- 164. Leetcode 435. 无重叠区间 (贪心算法-贪心区间)
class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if len(interval ...
最新文章
- INADDR_ANY 最好的解释
- GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...
- servlet之控制分发
- 微软Build 2018展示Visual Studio功能:跨系统云编程
- Linux中的【.】【./】【/】代表的含义【转载】
- sqlite:WAL模式
- 本地文件上传到阿里云生成网址
- EA建模-绘制活动图
- 谷歌浏览器设置关闭搜索记录
- ode45 matlab 出错,Matlab中ode45求解微分方程组出错。
- 【JPA/ddl-auto】关于JPA下hibernate通过设置ddl-auto完成数据库自动创建表格
- OCSP 在SSL证书中起什么作用
- vue单文件组件导入导出
- Linux系统磁盘空间不足解决办法
- 三七互娱后端工程师笔试记录
- 北京师范大学计算机考研难嘛,北京师范大学考研难吗?一般要什么水平才可以进入?...
- OC Extension Tangential(左右圆角)
- SystemUI的Plugin - 安卓R
- [个人笔记]HCIP-Routing Switching-IENP/H12-222
- C#中的延时函数sleep怎么使用