做这道题的主要目的是熟悉一下vector容器的使用。
这里使用容器的效果和使用数组的效果是一样的。
新建一个容器,在容器中存放struct类型的数据,排序用sort(v.begin(),v.end(),lessCompare);
解题思路:首先对所有线段按照左端点升序,若左端点相同,按右断点降序比较
bool lessCompare(const node& a,const node& b)
{
if(a.left==b.left)
return a.right>b.right;
return a.left<b.left;
}
两条线段i,j(i为当前指向的线段,j是与i比较的线段)的位置一个有3种情况:
1.线段重叠:比较max和重叠部分的大小;不需要跟新当前线段i,继续与j后面一条线段比较。
2.线段相交:比较max和相交部分的大小;把当前线段i更新为j,因为若后面的线段与j线段重叠,则重叠部分大于与线段i的重叠部分(这个可以自己仔细想一想,这也是前面为什么要进行排序的原因)。继续与j后面的线段比较。
3.线段不相交:则将当前线段i直接更新为j,继续与j后面的线段比较。
第3种情况其实可以和第2种情况合并。
源码附上:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node
{
int left,right;
}nodes;
bool lessCompare(const node& a,const node& b)
{
if(a.left==b.left)
return a.right>b.right;
return a.left<b.left;
}
int main()
{
vector<node> v;
int n,i,j;
cin>>n;
for(i=0;i<n;i++)
{
cin>>nodes.left>>nodes.right;
v.push_back(nodes);
}
sort(v.begin(),v.end(),lessCompare);
int max=0;
i=0,j=1;//i表示当前线段,j表示要比较的线段
while(j<n)
{
//线段重叠
if(v[i].left<=v[j].left&&v[i].right>=v[j].right)
{
if((v[j].right-v[j].left)>max)
{
max=v[j].right-v[j].left;
}
}
//线段相交和不相交的情况
else if(v[i].left<v[j].left&&v[i].right<v[j].right)
{
if((v[i].right-v[j].left)>max)
{
max=v[i].right-v[j].left;
}
i++;
}
j++;
}
cout<<max<<endl;
return 0;
}