区间完全覆盖问题----挤牛奶

来源:互联网 发布:梦幻西游淘宝网租号 编辑:程序博客网 时间:2024/05/19 05:01

/*
问题 挤牛奶--区间完全覆盖问题(在此题中为求最大值)
三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。
第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻。
第二个农民在700时刻开始,在 1200时刻结束。
第三个农民在1500时刻开始2100时刻结束。
期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),
而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300时刻(从1200时刻到1500时刻).编一个程序,
读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下
两点(均以秒为单位):  最长至少有一人在挤奶的时间段。最长的无人挤奶的时间段.(从有人挤奶开始算起)
Input

Line 1:  一个整数N。  Lines 2..N+1:  每行两个小于1000000的非负整数,表示一个农民的开始时刻与结束时刻。

Output

一行,两个整数,即题目所要求的两个答案。

Sample Input

3
300 1000
700 1200
1500 2100

Sample Output
900 300
 */
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct time             //农夫挤奶的开始时间和结束时间
{
 int st,et;
}a[5050];
int cmp(time j,time k)    //按挤奶开始时间升序排列
{
 return j.st<k.st;
}
int max(int p,int q)      //返回两个数中的最大值
{
 return(p>q?p:q);
}
int main()
{
 int n,i;
 int s_max,e_max,jn_max,bjn_max;
 cin>>n;
 for(i=0;i<n;i++)
 cin>>a[i].st>>a[i].et;
 sort(a,a+n,cmp);
 s_max=a[0].st;         //刚开始定义为a[0]的开始和结束值
 e_max=a[0].et;
 jn_max=a[0].et-a[0].st;  //挤奶最大时间定义为第一个农夫的挤奶时间段
 bjn_max=0;               //不挤奶最大时间定义为0
 for(i=1;i<n;i++)
 {
  if(e_max>=a[i].st) //前一个农夫的截止时间大于当前农夫的开始时间
  {
  if(a[i].et>=e_max) //当前农夫的时间段不被前一个农夫包含
  e_max=a[i].et;
  else                //否则则继续进行对下一个农夫的判断
  continue;
  }
  else if(e_max<a[i].st) //更新数据
  {
   jn_max=max(e_max-s_max,jn_max);
      bjn_max=max(a[i].st-e_max,bjn_max);
      s_max=a[i].st;
      e_max=a[i].et;
  }
 }
 cout<<jn_max<<' '<<bjn_max<<endl;
 return 0;
}

0 0
原创粉丝点击