zoukankan      html  css  js  c++  java
  • Milking Cows 挤牛奶

    1.2.1 Milking Cows 挤牛奶

    Time Limit: 1 Sec  Memory Limit: 64 MB
    Submit: 554  Solved: 108
    [Submit][Status][Forum]

    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
    

      经典贪心题。

      对于最长的挤奶时间,需要控制的是挤奶结束时间最晚的那个区间和那个结束点,如果下一个区间是在这个点之前结束的,直接continue就好,它对答案没有影响,如果是在这个点之前而且该区间的开始时间要小于这个点的话,就要更新答案和最后结束的那个点,否则,就说明一段连续的挤奶时间结束,和之前存储的最大的挤奶时间进行比较。

      对于最长的无人挤奶的时间,也是查不多的思想。

    但是,还会有一些细节需要注意,我在代码中给出标识。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<stack>
     8 #include<deque>
     9 #include<map>
    10 #include<iostream>
    11 using namespace std;
    12 typedef long long  LL;
    13 const double pi=acos(-1.0);
    14 const double e=exp(1);
    15 //const int MAXN =2e5+10;
    16 const int N = 5009;
    17  
    18 struct inteval
    19 {
    20     LL head;
    21     LL tail;
    22 } inteval[N];
    23 LL  check[N];
    24  
    25 bool cmp(struct inteval a,struct inteval b)
    26 {
    27     if(a.head==b.head)
    28         return a.tail<b.tail;
    29     return a.head<b.head;
    30 }
    31 int main()
    32 {
    33     LL n,i,p,j;
    34     LL work=0,rest=0;
    35  
    36     scanf("%lld",&n);
    37     for(i=0; i<n; i++)
    38     {
    39         scanf("%lld%lld",&inteval[i].head,&inteval[i].tail);
    40     }
    41     sort(inteval,inteval+n,cmp);
    42  
    43     LL a,b,mid=inteval[0].tail-inteval[0].head;
    44  
    45     work=mid=inteval[0].tail-inteval[0].head;
    46     b=inteval[0].tail;
    47     for(i=1; i<n; i++)
    48     {
    49         a=inteval[i].tail;
    50         if(a<=b)
    51             continue;
    52         else if(inteval[i].head<=b)
    53         {
    54             mid+=a-b;
    55             b=a;
    56         }
    57         else
    58         {
    59             if(mid>work)
    60                 work=mid;
    61             mid=a-inteval[i].head;
    62             b=inteval[i].tail;           //注意   最晚结束的那个点在这里不应该赋为零
    63         }
    64  
    65     }
    66     if(mid>work)      //注意  最后还要再比较一次
    67         work=mid;
    68  
    69     b=inteval[0].tail;
    70     for(i=1;i<n;i++)
    71     {
    72         a=inteval[i].head;
    73         if(b>=a)
    74         {
    75             if(inteval[i].tail>b)
    76                 b=inteval[i].tail;
    77             continue;
    78         }
    79         else
    80         {
    81             mid=a-b;
    82             b=inteval[i].tail;
    83             if(mid>rest)
    84                 rest=mid;
    85         }
    86     }
    87                                    // 注意  找最长的无人挤奶的时间段最后不能再比一次
    88     printf("%lld %lld
    ",work,rest);
    89  
    90     return 0;
    91 }
    View Code

      

  • 相关阅读:
    SQL的内连接与外连接
    for,foreach,iterator的用法和区别
    StringUtils中 isNotEmpty 和isNotBlank的区别
    Context解读
    常用的加密方式
    Android中前景,背景 和 Gravity的设置属性
    使用WebView时软键盘遮挡H5页面解决办法
    Git merge Dev 分支到 master
    C#高级编程笔记 Day 5, 2016年9月 13日 (泛型)
    C#高级编程笔记 Delegate 的粗浅理解 2016年9月 13日
  • 原文地址:https://www.cnblogs.com/daybreaking/p/9694943.html
Copyright © 2011-2022 走看看