基本思路:采用结构体数组存储所有数据,
/*
ID: boyshan1PROG: milk2
LANG: C++
*/
#include <iostream>
#include <fstream>
using namespace std;
struct Farmer
{
int begin;
int end;
};
int main()
{
ofstream fout("milk2.out");
ifstream fin("milk2.in");
int N,n,i,j;
Farmer f[5000];
while(fin>>N)
{
n=0;
while(N!=0)
{
fin>>f[n].begin>>f[n].end;
n++;
N--;
}
Farmer temp;
if(n==1) //特殊情况单独处理
{
fout<<f[n-1].end-f[n-1].begin<<" "<<0<<endl;
}
else
{
//先对每一组数据按开始时间升序原则进行排序
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(f[j].begin>f[j+1].begin)
{
temp=f[j];
f[j]=f[j+1];
f[j+1]=temp;
}
}
}
int c_time=f[0].end-f[0].begin; //c_time用来记录连续时间
int i_time=0; //i_time用来记录空闲时间
int start,ending,b; //start用来记录连续时间段中起始时间,ending记录结束时间
int continuous_time=0;
int idle_time=0;
start=f[0].begin;
ending=f[0].end;
for(i=1;i<n;i++)
{
if(f[i].begin<=ending)//两个时间段有重叠部分
{
if(f[i].end>=ending)
ending=f[i].end;
c_time=ending-start;
}
else //两个时间段没有重叠部分
{
i_time=f[i].begin-ending; //空闲时间等于当前时间段的开始时间 减去 以上时间段的结束时间
b=f[i].end-f[i].begin;
if(b>c_time)
c_time=b;
start=f[i].begin;//更新start和ending
ending=f[i].end;
}
if(continuous_time<=c_time)
continuous_time=c_time;
if(idle_time<=i_time)
idle_time=i_time;
}
fout<<continuous_time<<" "<<idle_time<<endl;
}
}
return 0;
}