• USACO Milking Cows


    洛谷 P1204 [USACO1.2]挤牛奶Milking Cows

    洛谷传送门

    JDOJ 1656: Milking Cows

    JDOJ传送门

    Description

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

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

    两点(均以秒为单位):

    • 最长至少有一人在挤奶的时间段.

    • 最长的无人挤奶的时间段.

    Input

    Line 1: 一个整数N.

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

    Output

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

    Sample Input

    3 300 1000 700 1200 1500 2100

    Sample Output

    900 300

    题解:

    再次重申!这个题型非常重要!!!

    模拟算法就不说了,关键是这道题怎么模拟。

    你要是想着标记数组,那你就是个弟弟。

    (因为我一开始就是这么做的)

    所以我考虑了结构体排序。

    你想,现在是几条线段互相覆盖,我们这么去想,先按照每个区间的左端点从大到小排序,然后开始遍历所有的区间,假如这个区间的右端点比当前区间(用ll,rr存两个端点)还要大,那我们就更新,以此类推。

    所以我们处理出ans1,ans2,最后输出就行。

    看代码理解更配。

    #include<bits/stdc++.h>
    using namespace std;
    int N; 
    struct node
    {
        int l,r;
    }p[5005];
    bool cmp(node a,node b)
    {
        return a.l<b.l;
    }
    int main()
    {
        scanf("%d",&N);
        for(int i=1;i<=N;i++)
            scanf("%d%d",&p[i].l,&p[i].r);
        sort(p+1,p+1+N,cmp);
        int ll=p[1].l;
        int rr=p[1].r;
        int ans1=0,ans2=0;
        for(int i=2;i<=N;i++)
        {
            if(p[i].l<=rr)
                rr=max(rr,p[i].r);
            else
            {
                ans1=max(ans1,rr-ll);
                ans2=max(ans2,p[i].l-rr);
                ll=p[i].l;
                rr=p[i].r;
            }
        }
        ans1=max(ans1,rr-ll);
        printf("%d %d",ans1,ans2);
        return 0;
    }
    
  • 相关阅读:
    sqlserver中递归写法
    keytools命令生成证书
    java中sql语句快速处理
    select * 替换写法
    oracle行转列
    oracle中查看当前用户的表结构、主键、索引
    Servlet三种实现方式
    【python之旅】python的面向对象
    【python之旅】python的模块
    【python之旅】python的基础三
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11294563.html
Copyright © 2020-2023  润新知