Description
在一维坐标轴中,给你N条线段,每条线段的起点和终点都是坐标轴上的整数点。例如,[10 29]和[12 25]的重叠部分为[12 25]。给出N条线段的起点(整数)和终点(整数),从中选择两条线段,使这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。
Input
多组输入数据,每组测试数据包含两行: 第1行:线段的数量N(2 <= N <= 50000)。 第2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)
Output
对于每组测试数据,输出最长重复区间的长度。
Sample Input
5 1 5 2 4 2 8 3 7 7 9
Sample Output
4 //这道题是贪心思想,不断更新最长线段的右区间;
#include <iostream> #include <algorithm> #include<cstdio> using namespace std; struct node { int x,y; } data[500005]; bool cmp(const node &a,const node &b) { if(a.x<b.x) return true; else if(a.x==b.x) { if(a.y<b.y) return true; else return false; } else return false; } int main() { int n,maxx; while(cin>>n) { maxx=0; for(int i=0;i<n;i++) scanf("%d%d",&data[i].x,&data[i].y); sort(data,data+n,cmp); int tmp=data[0].y,k; for(int i=1;i<n;i++) { if(data[i].y>=tmp) { maxx=max(maxx,tmp-data[i].x); tmp=data[i].y; } else maxx=max(maxx,data[i].y-data[i].x); } printf("%d\n",maxx); } return 0; }
时间: 2024-10-06 05:51:57