usaco1.2.1
题目描述
Milking Cows 挤牛奶
三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。
你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位):
- 最长至少有一人在挤奶的时间段。
- 最长的无人挤奶的时间段。(从有人挤奶开始算起)
PROGRAM NAME: milk2
INPUT FORMAT:
(file milk2.in)
- 第1行:一个整数N。
- 第2至第N+1行:每行两个小于1000000的非负整数,表示一个农民的开始时刻与结束时刻。
OUTPUT FORMAT:
(file milk2.out)
一行,两个整数,即题目所要求的两个答案。
样例输入
3 300 1000 700 1200 1500 2100
样例输出
900 300
其实这题也不难,我睡个觉的时间想出来的
但是我竟然耻辱的交了四遍(不服)
大概就是先排序一下
然后判断下一个区间有没有和这个区间相连
如果有就扩大区间
如果没有就更新两个最值
1 /* 2 ID:i_goodboy1 3 LANG:C++ 4 TASK:milk2 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 using namespace std; 10 int n; 11 struct e 12 { 13 int be,en; 14 }a[5010]; 15 bool cmp(e x,e y) 16 { 17 if(x.be!=y.be) 18 return x.be<y.be; 19 return x.en<y.en; 20 } 21 void read() 22 { 23 scanf("%d",&n); 24 for(int i=1;i<=n;i++) 25 scanf("%d%d",&a[i].be,&a[i].en); 26 } 27 void solve() 28 { 29 sort(a+1,a+n+1,cmp); 30 int s,t; 31 int maxn=a[1].en-a[1].be,minn=-10000; 32 s=a[1].be; 33 t=a[1].en; 34 for(int i=2;i<=n;i++) 35 { 36 if(a[i].be<=t) 37 if(a[i].en>t) 38 t=a[i].en; 39 if(a[i].be>t) 40 { 41 if(t-s>maxn) 42 maxn=t-s; 43 if(a[i].be-t>minn) 44 minn=a[i].be-t; 45 s=a[i].be; 46 t=a[i].en; 47 } 48 } 49 if(minn==-10000) 50 minn=0; 51 cout<<maxn<<' '<<minn<<endl; 52 } 53 int main() 54 { 55 freopen("milk2.in","r",stdin); 56 freopen("milk2.out","w",stdout); 57 read(); 58 solve(); 59 return 0; 60 }
---QQ:2602626065