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  阅读(257)  评论(0编辑  收藏  举报

导航