zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    String的equals和hashCode方法
    查看oracle中表的索引
    初识RESTful
    linux安装字体库(simSun为例)
    排序之快排(JS)
    面向对象的三个基本特征 和 五种设计原则
    排序之希尔排序(JS)
    关于正则表达式
    Oracle 表分区介绍与使用
    一个复杂关联的sql
  • 原文地址:https://www.cnblogs.com/icedream61/p/4321406.html
Copyright © 2011-2022 走看看