USACO1.2.1 Milking Cows 给奶牛挤奶

一.题目要求

Milking Cows

Three farmers rise at 5 am each morning and head for the barn to milk three cows. The first farmer begins milking his cow at time 300 (measured in seconds after 5 am) and ends at time 1000. The second farmer begins at time 700 and ends at time 1200. The third farmer begins at time 1500 and ends at time 2100. The longest continuous time during which at least one farmer was milking a cow was 900 seconds (from 300 to 1200). The longest time no milking was done, between the beginning and the ending of all milking, was 300 seconds (1500 minus 1200).

Your job is to write a program that will examine a list of beginning and ending times for N (1 <= N <= 5000) farmers milking N cows and compute (in seconds):

  • The longest time interval at least one cow was milked.
  • The longest time interval (after milking starts) during which no cows were being milked.

PROGRAM NAME: milk2

INPUT FORMAT

Line 1:The single integer
Lines 2..N+1:Two non-negative integers less than 1000000, the starting and ending time in seconds after 0500

SAMPLE INPUT (file milk2.in)

3
300 1000
700 1200
1500 2100

OUTPUT FORMAT

A single line with two integers that represent the longest continuous time of milking and the longest idle time.

SAMPLE OUTPUT (file milk2.out)

900 300

二.解题思路

1.最开始是用快排方法,按开始时间的升序,将时间段排序,但是遇到了一个障碍,各个时间段的重叠方式太多样,有些不知道怎么分类了,之后再想想。

2.其实开始的时候思维混乱了,明明排完序就没有那么多种情况了。

   之后还是三种情况分类讨论:1.后面被前面包掉 2.后面与前面有交集 3.后面与前面相隔开  然后针对不同情况分析讨论即可

3.有几个细节问题要格外注意

     1.这里的前面不是前一个数组,而是改变之后的tmpmin 和 tmpmax 之间的间隔。

     2.对于等号的处理要注意,把它放在哪种情况很重要

4.记住,写程序的时候,要尽量小心的考虑到各种边界情况,然后写的测试文件要包括这些情况,否则是不行的。


三.代码

/*
ID:grj11292
PROG:milk2
LANG:C++
*/


#include<fstream>
using namespace std;


int *startTime,*endTime;
void quickSort(int *a,int *b,int low,int high);
int divide(int *a,int *b,int low,int high);
int main()
{
    ifstream fin("milk2.in");
    ofstream fout("milk2.out");
    int num;
    fin>>num;
    startTime=new int[num+1];
    endTime=new int[num+1];
    for(int i=0;i<num;++i)fin>>startTime[i]>>endTime[i];
    int leastoneTime=0,noTime=0;
    int time1=0,time2=0;
    int tmpMin=0,tmpMax=0;
    if(num==1)fout<<endTime[0]-startTime[0]<<' '<<0<<endl;
    else
    {
        quickSort(startTime,endTime,0,num-1);
        tmpMin=startTime[0];
        tmpMax=endTime[0];
        int j=0;
        while(j<num-1)
      {
        if(j<num-1 && startTime[j+1]<=tmpMax && endTime[j+1]<=tmpMax)
        {
            time1=time1>(tmpMax-tmpMin)?time1:(tmpMax-tmpMin);
            j++;
        }
        if(j<num-1 && startTime[j+1]<=tmpMax && endTime[j+1]>tmpMax)
        {
            tmpMax=endTime[j+1];
            time1=time1>(tmpMax-tmpMin)?time1:(tmpMax-tmpMin);
            j++;
        }


        if(j<num-1 && startTime[j+1]>tmpMax)
        {
            time1=time1>(endTime[j+1]-startTime[j+1])?time1:(endTime[j+1]-startTime[j+1]);
            time2=time2>(startTime[j+1]-tmpMax)?time2:(startTime[j+1]-tmpMax);
            tmpMin=startTime[j+1];
            tmpMax=endTime[j+1];
            j++;
        }
      }
        leastoneTime=time1;
        noTime=time2;
        fout<<leastoneTime<<' '<<noTime<<endl;
     }




    fin.close();
    fout.close();
    delete [] startTime;
    delete [] endTime;
    return 0;
}
void quickSort(int *a,int *b,int low,int high)
{
    int mid;
    if(low>=high)return;
    mid=divide(a,b,low,high);
    quickSort(a,b,low,mid-1);
    quickSort(a,b,mid+1,high);
}
int divide(int *a,int *b,int low,int high)
{
    int tmp=a[low];
    int tmp1=b[low];
    do{
        while(high>low && a[high]>=tmp)high--;
        if(high>low){a[low]=a[high];b[low]=b[high];low++;}
        while(high>low && a[low]<=tmp)low++;
        if(high>low){a[high]=a[low];b[high]=b[low];high--;}
    }while(low!=high);
    a[low]=tmp;
    b[low]=tmp1;
    return low;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值