【USACO题库】1.2.1 Milking Cows挤牛奶

题目描述:

三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻。第二个农民在700时刻开始,在 1200时刻结束。第三个农民在1500时刻开始2100时刻结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200时刻到1500时刻)。

你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位):

最长至少有一人在挤奶的时间段。
最长的无人挤奶的时间段。

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

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

样例输入
3
300 1000
700 1200
1500 2100

样例输出
900 300


这道题比较简单。首先,先按开始时刻排个序。
对于第一问我们只用考虑当st[i]>=en[i-1]的情况,当前开头s与当前结尾e的最大值。如果当st[i]<en[i-1]的时候,就要重新更新x和y的值。
对于第二问,我们只用看当前max(en[i-1]),然后用st[i]-这个值的最大值就等于答案了。

代码:
var
        i,n,ans1,ans2,s,e:longint;
        st,en:array[0..5000] of longint;
function max(x,y:Longint):Longint;
begin
        if x>y then max:=x else max:=y;
end;
procedure sort(l,r:longint);
var
        i,j,mid:Longint;
begin
        i:=l; j:=r;
        mid:=st[(l+r) div 2];
        while i<j do
        begin
                while st[i]<mid do inc(i);
                while st[j]>mid do dec(j);
                if i<=j then
                begin
                        st[0]:=st[i]; st[i]:=st[j]; st[j]:=st[0];
                        en[0]:=en[i]; en[i]:=en[j]; en[j]:=en[0];
                        inc(i); dec(j);
                end;
        end;
        if l<j then sort(l,j);
        if i<r then sort(i,r);
end;
begin
        readln(n);
        for i:=1 to n do
                readln(st[i],en[i]);
        sort(1,n);

        s:=st[1]; e:=en[1];
        ans1:=e-s;
        for i:=2 to n do
        begin
                if st[i]<=e then e:=max(e,en[i])
                else
                begin
                        s:=st[i];
                        e:=en[i];
                end;
                ans1:=max(ans1,e-s);
        end;

        ans2:=0;
        e:=en[1];
        for i:=2 to n do
        begin
                if (st[i]>e) then ans2:=max(ans2,st[i]-e);
                e:=max(e,en[i]);
        end;

        writeln(ans1,' ',ans2);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值