USACO之Section1.2.1 Milking Cows [其他]

【题意】三个农民每天清晨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;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值