USACO Section1.2 Milking Cows 解题报告
milk2解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
N个农民,每个农民从L[i]到R[i]时间给奶牛挤奶。问最长的一直有人挤奶的时间,和最长的没有人挤奶的时间。
【数据范围】
1<=N<=5000
0<=L[i],R[i]<=1,000,000
【输入样例】
3
300 1000
700 1200
1500 2100
【输出样例】
900 300
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
先对N个农民按照L[i]排序,然后顺序扫。
我用Sum[0]记录最长一直没人挤奶的时间,用Sum[1]记录最长一直有人挤奶的时间。
用Lt记录当前所考虑的开始时间,Rt记录当前所考虑的结束时间。
“a←b”表示用b更新a,即 if(b>a) a=b;
开始 Lt=L[1]; Rt=R[1];
如果 R[i]<L[i+1],说明i和i+1时间分开了,那么 Sum[0]←L[i+1]-Rt; Sum[1]←Rt-Lt;
否则,说明i+1可以和i的挤奶时间连上,那么 Rt←R[i+1];
算法描述完毕,注意别写错就好。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
一遍AC。
复习了下快排~
还有由于直接上手写的代码,代码不漂亮:
1.bool变量p没用上
2.L和R如果定义成Time类型,和T[]保持一致就更好看了
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
1 /* 2 ID: icedrea1 3 PROB: milk2 4 LANG: C++ 5 */ 6 7 #include <iostream> 8 #include <fstream> 9 using namespace std; 10 11 int N; 12 struct Time { int b,g; } T[1+5000]; 13 14 void qsort(Time T[],int l,int r) 15 { 16 if(l>=r) return; 17 18 int i=l,j=r,x=T[(l+r)>>1].b; 19 while(true) 20 { 21 while(T[i].b<x) ++i; 22 while(T[j].b>x) --j; 23 if(i>j) break; 24 Time t=T[i]; T[i]=T[j]; T[j]=t; 25 ++i; --j; 26 } 27 qsort(T,l,j); qsort(T,i,r); 28 } 29 30 void change(int &a,int b) 31 { 32 if(b>a) a=b; 33 } 34 35 int main() 36 { 37 ifstream in("milk2.in"); 38 ofstream out("milk2.out"); 39 40 in>>N; 41 for(int i=1;i<=N;++i) in>>T[i].b>>T[i].g; 42 43 qsort(T,1,N); 44 45 bool p; // Ture挤奶,F空闲 46 int L,R; // 当前时间段 47 int Sum[2]={0,0}; // 最大值——0空闲时间,1挤奶时间 48 49 L=T[1].b; R=T[1].g; 50 for(int i=1;i<=N;++i) 51 { 52 if(R<T[i+1].b) // 挤奶时间完结 53 { 54 change(Sum[0],T[i+1].b-R); 55 change(Sum[1],R-L); 56 L=T[i+1].b; R=T[i+1].g; 57 } 58 else // 更新挤奶时间 59 { 60 change(R,T[i+1].g); 61 } 62 } 63 change(Sum[1],R-L); 64 65 out<<Sum[1]<<" "<<Sum[0]<<endl; 66 67 in.close(); 68 out.close(); 69 return 0; 70 }
posted on 2015-03-08 23:25 IceDream61 阅读(259) 评论(0) 编辑 收藏 举报