USACO 1.2 - Milking Cows


USACO 1.2 – Milking Cows | Jack Neus
Three farmers rise at 5 am each morning and head for the barn to milk three cows. The first farmer begins milking his cow at time 300 (measured in seconds after 5 am) and ends at time 1000. The second farmer begins at time 700 and ends at time 1200. The third farmer begins at time 1500 and ends at time 2100. The longest continuous time during which at least one farmer was milking a cow was 900 seconds (from 300 to 1200). The longest time no milking was done, between the beginning and the ending of all milking, was 300 seconds (1500 minus 1200).
Your job is to write a program that will examine a list of beginning and ending times for N (1 <= N <= 5000) farmers milking N cows and compute (in seconds):

NPUT FORMAT

Line 1:The single integer
Lines 2..N+1:Two non-negative integers less than 1000000, the starting and ending time in seconds after 0500

SAMPLE INPUT (file milk2.in)

3
300 1000
700 1200
1500 2100

OUTPUT FORMAT

A single line with two integers that represent the longest continuous time of milking and the longest idle time.

SAMPLE OUTPUT (file milk2.out)

900 300

X.
https://gist.github.com/stphung/917012
    int numIntervals = sc.nextInt();
    Interval[] intervals = new Interval[numIntervals];
    for (int i = 0; i < numIntervals; i++) {
      intervals[i] = new Interval(sc.nextInt(), sc.nextInt());
    }
    Arrays.sort(intervals, new Comparator<Interval>() {
      @Override
      public int compare(Interval o1, Interval o2) {
        return o1.getLow() - o2.getLow();
      }
    });

    // Single pass scan
    int low = intervals[0].getLow();
    int high = intervals[0].getHigh();
    int maxInterval = high - low;
    int maxGap = 0;
    for (int i = 1; i < intervals.length; i++) {
      Interval a = intervals[i];
      if (a.getLow() <= high) {
        high = Math.max(a.getHigh(), high);
      } else {
        maxInterval = Math.max(maxInterval, high - low);
        maxGap = Math.max(maxGap, a.getLow() - high);
        low = a.getLow();
        high = a.getHigh();
      }

    }
https://blog.csdn.net/tsing1996/article/details/72598525
题意概述:
    第一行输入一个整数N,表示有N个工作区间,接下依次输入每个区间的开始和结束时间,求从这里面最早的    一个  开始时间到最晚的结束时间这个时间区间内的最长连续工作区间和最长连续不工作区间。
解题思路:
    数据区间只在10^6范围内,且都是线性操作,所以直接用数组来模拟区间状态,但这个时候需要注意,比如   两个  工作区间分别为(100,200),(201,300),这两个区间其实不是连续的,因此数组元素需要表示的应该   是从这个元素下标的时刻开始,到这个下标+1的时刻这一单位区间内是否处于工作的状态。因此在输入了一个区  间的开始结束时间后,要做的是把数组下标从开始时间到结束时间-1这一范围内的值都标记为工作状态.
题解代码:

http://mangogao.com/read/51.html
struct Milk
{
    int begin;
    int end;
    bool operator<(const Milk &a) const
    {
        return begin < a.begin;
    }
};
int main()
{
    ifstream fin("milk2.in");
    ofstream fout("milk2.out");
    int n;
    int left,right,ans0(0),ans1(0);
    Milk t[5000];
    fin >> n;
    for (int i = 0; i < n; ++i) fin >> t[i].begin >> t[i].end;
    sort(t,t+n);
    left = t[0].begin;
    right = t[0].end;
    for (int i = 0; i < n; ++i)
    {
        if (t[i+1].begin <= right)
        {
            right = max(right, t[i+1].end);
            ans1 = max(ans1, right-left);
        }
        else
        {
            ans1 = max(ans1, right-left);
            ans0 = max(ans0, t[i+1].begin-right);
            left = t[i+1].begin;
            right = t[i+1].end;
        }
    }
    fout << ans1 << " " << ans0 << endl;
    return 0;
}

http://jaykaychoi.tistory.com/16

X. http://code.antonio081014.com/2012/09/usaco-milking-cows.html
    public void solve() throws Exception {
        BufferedReader br = new BufferedReader(new FileReader("milk2.in"));
        BufferedWriter out = new BufferedWriter(new FileWriter("milk2.out"));
        int N = Integer.parseInt(br.readLine());
        count = new int[1000001];
        startTime = 1000000;
        endTime = 0;
        for (int i = 0; i < N; i++) {
            String[] strs = br.readLine().split("\\s");
            int start = Integer.parseInt(strs[0]);
            int end = Integer.parseInt(strs[1]);
            startTime = Math.min(start, startTime);
            endTime = Math.max(end, endTime);
            for (int k = start; k < end; k++)
                count[k]++;
        }
        int maxTime1 = 0;
        int maxTime2 = 0;
        int tmp1 = 0;
        int tmp2 = 0;
        for (int i = startTime; i < endTime; i++) {
            if (count[i] > 0) {
                tmp1++;
                tmp2 = 0;
            }
            else {
                tmp2++;
                tmp1 = 0;
            }

            maxTime1 = Math.max(maxTime1, tmp1);
            maxTime2 = Math.max(maxTime2, tmp2);
        }
        out.write("" + maxTime1 + " " + maxTime2 + "\n");
        out.close();
    }
http://blog.tomtung.com/2007/02/usaco-milking-cows/
http://acm.sdibt.edu.cn/blog/?p=1454
http://jackneus.com/programming-archives/milking-cows/

https://computerworld.mushiyo.cf/2012/01/usacosection-12-milking-cows.html
https://www.waitig.com/usaco-section-1-2-milking-cow枚举.html
我本题的解法类似于此……虽然感觉这题的区间为1000 000没准有点太大了不可以这么玩,-_-||,但是运气好的是AC了。
bool period [MAX]; int main(int argc, char **argv) { int n,i,j; int start,finish; int was = -1,no = -1; //记录题解 int minStart = 1000002; //最初开始时间 int maxFinish = 0; //最后结束时间 ofstream fout ("milk2.out"); ifstream fin ("milk2.in"); cin >> n; for(i = 0; i<MAX; i++) { period[i] = false; } for(j = 0; j<n; j++) { cin >> start >> finish; if(start < minStart) minStart = start; if(finish > maxFinish) maxFinish = finish; for(i = start; i < finish; i++) period[i] = true; } for(i = minStart; i <= maxFinish; i++) { j = i; while(period[i] == true && i <= maxFinish) i ++; //至少有一个农民的时间 if(i-j > was) was = i-j; } for(i = minStart; i <= maxFinish; i++) { j = i; while(period[i] == false && i < maxFinish) i ++; //没有人的时间 if(i-j > no) no = i-j; } cout << was << " " << no << endl; return 0; }
Read full article from USACO 1.2 – Milking Cows | Jack Neus

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts