51 NOD 1091 线段的重叠

来源:互联网 发布:手机ai软件下载 编辑:程序博客网 时间:2024/06/06 13:07

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091


1091 线段的重叠
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
 收藏
 关注
X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。
给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。
Input
第1行:线段的数量N(2 <= N <= 50000)。第2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)
Output
输出最长重复区间的长度。
Input示例
51 52 42 83 77 9
Output示例
4


解析:    求最长重叠线段的长度,这就要用到贪心思想,一直贪心选择最优的,先排下序(起点升序,终点降序),使一直取最大区间的去更新

               重叠长度即可


具体代码如下:


#include<bits/stdc++.h>#define N 50009using namespace std;struct node{    int x, y;}p[N];bool cmp(node a, node b){    return a.x == b.x ? (a.y > b.y) : (a.x < b.x);}int main(){    int i, n;    scanf("%d", &n);    for(i = 1; i <= n; i++) scanf("%d%d", &p[i].x, &p[i].y);    sort(p + 1, p + n + 1, cmp);    int ans = 0, id = 1;    for(i = 2; i <= n; i++)    {        ans = max(ans, min(p[i].y - p[i].x, p[id].y - p[i].x));        id = p[id].y > p[i].y ? id : i;    }    printf("%d\n", ans);    return 0;}



0 1
原创粉丝点击