2017-5-23
题目大意:
读入N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,
求最长至少有一人在挤奶的时间段。
最长的无人挤奶的时间段。(从有人挤奶开始算起)
样例输入:
3
300 1000
700 1200
1500 2100
样例输出:
900 300
题解:
排序解决。按照农名开始挤牛奶的时间进行排序,问题转化为三个子问题,即三种情况。用start 和 end 标记目前时间段
1、后一个农名的开始和结束时间都在标记时间段内,则挤牛奶时间和没人挤牛奶时间均不受影响,标记点不变。
2、后一个农名的开始时间在标记时间段内,结束在为,挤牛奶时间加长,没人挤牛奶时间不变,改变end点。
3、后一个农名的开始时间不在时间段内,则出现空时间,改变标记点。
代码:
C++
/*
ID: mujinui1
PROG: milk2
LANG: C++
*/
#include <iostream>
#include<fstream>
#include <algorithm>
#define N 5001
using namespace std;
int start[5001],end[5001];
int main(){
ofstream fout ("milk2.out");
ifstream fin ("milk2.in");
int n;
fin>>n;
for(int i=0;i<n;i++){
fin>>start[i]>>end[i];
}
for(int i=0;i<n-1;i++){
for(int j=i;j<n;j++){
if(start[i]>start[j]){
int temp;
temp=start[i];
start[i]=start[j];
start[j]=temp;
temp=end[i];
end[i]=end[j];
end[j]=temp;
}
}
}
// for(int i=0;i<n;i++){
// fout<<start[i]<<" "<<end[i]<<endl;
// }
int mark1,mark2,yes=0,no=0;
mark1=0,mark2=0;
yes=end[0]-start[0];
for(int i=1;i<n;i++){
//wan quan bao han
if(end[i]<end[mark2]){
//mark2=i;yes=max(yes,end[mark2]-yes[mark1]);
}
//bu wan quan
if(start[i]<=end[mark2]&&end[i]>end[mark2]){
mark2=i;yes=max(yes,end[mark2]-start[mark1]);
}
// wan quan bu
if(start[i]>end[mark2]){
yes=max(yes,end[mark2]-start[mark1]);
no=max(no,start[i]-end[mark2]);
mark1=i,mark2=i;
}
}
fout<<yes<<" "<<no<<endl;
return 0;
}