不会,看了博客才知道的,题意是叫我们求两条线段重叠的最长距离,我们先把结构体排序,按照起点从小到大的顺序,那么
str[i-1].l<=str[i].l 是一定成立的,那么我们只要找i前面所有的线段的终点最大的那条(假设最大的终点为end),如果end<=str[i].r,
那么重叠的长度就是end-str[i].l, 而如果end>str[i].r,那么重叠长度就是str[i]的长度(str[i].r-str[i].l),然后再用这个重叠长度去更新之前已经得出的最大重叠长度,最后得到答案。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node{ int l,r; }str[50005]; int ans,n,m,k; bool cmp(node s1,node s2) { return s1.l<s2.l; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&str[i].l,&str[i].r); sort(str,str+n,cmp); int end=str[0].r; int ans=0; for(int i=1;i<n;i++) { if(str[i].r>end) { ans=max(ans,end-str[i].l); end=str[i].r; } else { ans=max(ans,str[i].r-str[i].l); } } printf("%d ",ans); return 0; }