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 }

 

你可能感兴趣的:(USACO)