题意:给定n个区间,求删掉一个区间后区间的最大长度
思路:先按左端点start,再按右端点end进行升序排序。去掉某一区间后,枚举每个区间将有效长度记录到总的区间长度sum中。last记录上次的右端点。如果当前区间的start大于last,则有效区间长度为完整的[start,end]。否则如果当前区间的end大于last,则有效区间长度为[last,end]。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx = 1e6 + 10;
const int inf=0x3f3f3f3f;
int n;
struct node
{
int start,end;
}a[110];
bool cmp(node a,node b)
{
if(a.start==b.start) return a.end<b.end;
return a.start<b.start;
}
void solve()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a[i].start,&a[i].end);
}
sort(a+1,a+n+1,cmp);
int ans=-inf;
for(int i=1;i<=n;i++)
{
int last=-1,sum=0;
for(int j=1;j<=n;j++)
{
if(j==i) continue;
if(a[j].start>last)
{
sum+=a[j].end-a[j].start;
last=a[j].end;
}
else if(a[j].end>last)
{
sum+=a[j].end-last;
last=a[j].end;
}
}
ans=max(ans,sum);
}
printf("%d",ans);
}
int main()
{
int _t=1;
//scanf("%d", &_t);
while (_t--)
{
solve();
}
system("pause");
}