【题意】三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。
你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位):
最长至少有一人在挤奶的时间段。
最长的无人挤奶的时间段。(从有人挤奶开始算起)
【分析】这道题开始的思路是:将时间段排序,然后用一个布尔型的数组去标记,看布尔型数组为true的最长值,和为false的最长值,即为结果。
但是时间为小于1000000的数,而且农民的个数为(1<=N<=5000)。于是想用简单的方法。
我采用将时间段记为一组(可以组成结构体),对组进行排序,(先比较开始时间,当开始时间相等时,比较结束时间),在此期间对结果进行统计。这里我尝试不用结构体去存储起点和终点,我将用C++中的一种pair模板,用法可自行百度,这里我只讲解我用到的功能,以后还会对其进行总结。
定义pair类型时,可用typedef pair<int ,int>p;赋值时,可用形如pair<int ,int > p1= make_pair(5,6);输出属性值时,可用p.first, p.second
同时我才用了vector对pair进行存储,所以我采用自定义sort函数。
具体代码如下:
/*
ID:m1519591
PROG: milk2
LANG:C++
*/
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int ,int> t;
vector<t>time;
bool cmp(const pair<int,int> &a,const pair<int,int> &b)
{
if(a.first!=b.first)
return a.first<b.first;
else
return a.second<b.second;
}
int main()
{
//
// ofstream cout ("milk2.out");
// ifstream cin ("milk2.in");
int ans1=0,ans2=0;
int n,fro,end;
cin>>n;
for(int i=0;i<=n-1;i++)
{
cin>>fro>>end;
time.push_back(make_pair(fro,end));
}
sort(time.begin(),time.end(),cmp);
for(int i=1;i<=n-1;i++)
{
fro=time[i-1].first;
end=time[i-1].second;
if(end>=time[i].first)
{
end=max(end,time[i].second);
ans1=max(ans1,end-fro);
}
else{
fro=end;
end=time[i].first;
ans2=max(end-fro,ans2);
}
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}