第一种方法 标记一下开始和结束时间 然后扫一遍 就能得出答案了
#include<cstdio>
#include<cstring>
const int maxn=1000000+5;
int vis[maxn];
int main()
{
int n,x,y;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
int up=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
if(y>up) up=y;
vis[x]++;
vis[y]--;
}
int ans1=0,ans2=0;
int cur=0,cnt1=0,cnt2=0;
bool start=false;
for(int i=0;i<=up;i++)
{
if(vis[i]) start=true;
cur+=vis[i];
if(cur>0)
{
cnt1++;
if(cnt2>ans2)
ans2=cnt2;
cnt2=0;
}
else if(cur==0)
{
if(start)
cnt2++;
if(cnt1>ans1)
ans1=cnt1;
cnt1=0;
}
}
printf("%d %d
",ans1,ans2);
return 0;
}
第二种方法 按开始时间排序 然后
从左到右扫一遍,记录一个当前区间,[tmp.begin , tmp.end]
如果下一组数据的begin比tmp.end的小(或相等),则是连接起来的,检查这组数据的end,取max{end , tmp.end}。
如果下一组数据的begin比tmp.end的大,则是相互断开的,整理本区间,ans1取max{tmp.end - tmp.begin , ans1}。ans2取max{begin - tmp.end , ans2}
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=5000+5;
struct farmer
{
int begin;
int end;
bool operator <(const farmer &a) const
{
return begin<a.begin;
}
}a[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].begin,&a[i].end);
sort(a,a+n);
farmer tmp=a[0];
int ans1=a[0].end-a[0].begin,ans2=0;
for(int i=1;i<n;i++)
{
if(a[i].begin<=tmp.end)
tmp.end=max(tmp.end,a[i].end);
else
{
ans1=max(ans1,tmp.end-tmp.begin);
ans2=max(ans2,a[i].begin-tmp.end);
tmp=a[i];
}
}
printf("%d %d
",ans1,ans2);
return 0;
}