USACO Section 1.2 Milking Cows

题目描述

三名农民每天早晨五点钟起床,并且挤谷仓牛奶三头牛。 第一个农民在时间300开始挤奶他的牛(在上午5点之后以秒为单位),并在时间1000结束。第二个农民在时间700开始,在时间1200结束。第三个农民在时间1500开始,在时间2100结束。 至少有一名农民挤牛时间最长的连续时间是900秒(从300到1200)。 在所有挤奶的开始和结束之间,最长时间没有挤奶,是300秒(1500减去1200)。

您的工作是编写一个程序,将检查N(1 <= N <= 5000)个农民挤奶牛和计算(以秒计)的开始和结束时间列表:
•最长的时间间隔至少有一头牛被挤奶。
•挤奶期间最长的时间间隔(在挤奶开始之后),在此期间没有奶牛被挤奶。

程序名称:milk2

输入格式

第1行:单个整数,N
行2..N + 1:两个非负整数小于1,000,000,分别为0500之后的开始和结束时间(以秒为单位)

输入(file milk2.in)

3
300 1000
700 1200
1500 2100

输出格式
一个单行,表示两个整数,表示最长的连续挤奶时间和最长的空闲时间。

输出(file milk2.out)

900 300
解题思路
本题主要思路是,因为要考虑最长连续挤奶时间和空闲时间,所以我们要对每组数据进行排序,然后前后比较进行判断。两个人的时间段有以下几种情况:
1代表开始,2代表结束,蓝色代表前一个人,红色代表后一个人
一,后一个人的开始在前一个人开始结束之间
1)后一个人的结束也在前一个人开始结束之间


2)后一个人的结束不在前一个人开始结束之间

USACO Section 1.2 Milking Cows_第1张图片


二,后一个人的开始不在前一个人开始结束之间


我们需要分别考虑。
解题代码

/* ID: 15189822 PROG: milk2 LANG: C++ */ #include #include #include using namespace std; ofstream fout("milk2.out"); ifstream fin("milk2.in"); int n; struct WorkTime{ int start; int end; }; int cmp(const void *a ,const void *b ){ return (*(WorkTime *)a).start - (*(WorkTime *)b).start; } int main(){ while(fin>>n){ WorkTime *time=new WorkTime[n];//定义一个长度为n的结构体数组 for(int i=0;i>time[i].start>>time[i].end; } qsort(time,n,sizeof(time[0]),cmp);//将n个人的开始结束时间按照开始时间排序 int maxWork=time[0].end-time[0].start;//最长工作时间 int maxFree=0;//最长空闲时间 for(int i=1,start=time[0].start,end=time[0].end;imaxWork){ maxWork=t; } } else{ int t =time[i].start-end; end =time[i].end; start =time[i].start; if(t>maxFree){ maxFree=t; } t=time[i].end-time[i].start; if(t>maxWork){ maxWork=t; } } } fout<

你可能感兴趣的:(USACO,开发语言,算法)