Milking Cows 挤牛奶
1.2.1 Milking Cows 挤牛奶
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 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\n",work,rest); 89 90 return 0; 91 }