5.在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。

2024-09-03 04:18

本文主要是介绍5.在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这种题目见过一些类似的题目。这里整理一下思路。

一位很牛逼的网友写的,点击打开链接。用的是分治法,类似于归并排序。

还有一种动态规划的方法,点击打开链接,思路如下:

假设S[n]表示n条线段中最长重叠距离,最长重叠距离只与两条线段有关,那么考虑两种情况:

1. 最长重叠距离与第n条线段无关,则最长重叠距离存在于前n-1条线段中,即S[n]=S[n-1];
2. 最长重叠距离与第n条线段有关,则最长重叠距离为第n条线段与前面n-1条线段中的最大重叠距离者,S[n]=max(overlap(segment[n],segment[i])), i=1....n-1

因此得到状态转移方程:

S[n]=0; n<=1
S[2]=overlap(segment[0],segment[1])
S[n]=max(S[n-1],max(overlap(segment[n],segment[i])))

 

这里复习一下动态规划:点击打开链接


代码如下,原版抄的,自己水平真心有限

#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;typedef struct{int start;int end;
}segment;bool isShorter(const segment &s1,const segment &s2);
segment commonSegment(const segment &seg_a,const segment &seg_b);
int findLongestSegment(const vector<segment> &segments,int size,segment &maxSegment);int main()
{int n;int start,end;cout<<" 输入线段个数"<<endl;while(cin>>n){vector<segment>segments(n);for(int i=0;i<n;++i){if(cin>>start && cin>>end){segments[i].start=start;segments[i].end=end;}}sort(segments.begin(),segments.end(),isShorter);segment maxSeg;int maxLen=findLongestSegment(segments,n,maxSeg);cout<<"Longest Length:"<<maxLen<<endl;cout<<"start:"<<maxSeg.start<<endl;cout<<"end:"<<maxSeg.end<<endl;}/*system("pause");*/return 0;
}bool isShorter(const segment &s1,const segment &s2){return s1.end<s2.end;	
}segment commonSegment(const segment &seg_a,const segment &seg_b){segment commonSeg;if(seg_a.end < seg_b.start){commonSeg.start=0;commonSeg.end=0;}else{commonSeg.start=seg_b.start;commonSeg.end=seg_a.end;}return commonSeg;
}int findLongestSegment(const vector<segment> &segments,int size,segment &maxSegment){if(size <= 0)return 0;if(size == 1){maxSegment.start=segments[0].start;maxSegment.end=segments[0].end;return maxSegment.end-maxSegment.start;	}if(size == 2){maxSegment = commonSegment(segments[0],segments[1]);return maxSegment.end-maxSegment.start;}//szie>2 动态规划int maxLen,tempLen;segment tempMaxSeg;maxLen = findLongestSegment(segments,size-1,tempMaxSeg); //递归maxSegment = tempMaxSeg; segment commonSeg;for(int i=0;i<size-1;++i){ //这里记得是size-1,链接中打错了commonSeg=commonSegment(segments[i],segments[size-1]);//只需比较最后一个和前面每一个的公共区间tempLen=commonSeg.end-commonSeg.start;if(tempLen > maxLen){maxLen= tempLen;maxSegment=commonSeg;}}return maxSegment.end-maxSegment.start;
}

这篇关于5.在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132002

相关文章

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

hihocoder1050 : 树中的最长路

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

计蒜客 Skiing 最长路

In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort has MM different ski paths and NN different flags situated at those turning points. The ii-th path from the