USACO之Section1.2.1 Milking Cows [其他]

来源:互联网 发布:超级电容给单片机供电 编辑:程序博客网 时间:2024/06/05 20:31

【题意】三个农民每天清晨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; } 
原创粉丝点击