USACO s1.2.Milking Cows(求最长连续时间和最长间断时间)

题意:输入多个时间段,表示喂牛的时间,问喂牛的最长的持续时间和不喂牛的最长的时间。

key:注意输入的时间没有先后顺序。有两种方法。一是对时间段进行排序,比较每段时间的的末尾就行了,记得求得最大连续时间的时候要更新最后的时间,更新最大间断时间的时候要更新最前面的时间。方法二,用数组标记喂牛时间,,for一遍大概就可以找到这两个时间了。下面的是方法一。

/*
TASK:milk2
LANG:C++
ID:huibaochen
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
const int maxn = 5000 + 5;
struct Node
{
    int l,r;
    bool operator < (const Node &a) const     //对区间进行排序,如果起点相同就按终点排序,否则按起点从小到大排
    {
        return a.l > l || (a.l == l && a.r > r); //这个完了之后在main函数里sort一遍就可以通过比较终点来确定最大的连续区间和最大的间断区间
    }
}p[maxn];

int main()
{
    freopen ("milk2.in", "r", stdin);
    freopen ("milk2.out", "w", stdout);
    int t;
    int longer, last, max1, max2;
    while(scanf("%d", &t) != EOF){
        longer = last = max1 = max2 = 0;
        memset(p, 0, sizeof(p));
        for(int i = 0; i < t; i++){
            scanf("%d%d", &p[i].l, &p[i].r);
        }
        if(t == 1)
            printf("%d 0\n",p[0].r - p[0].l);
        else{
            sort(p, p + t);
            int end = p[0].r, start = p[0].l;
            max1 = p[0].r - p[0].l;
            for(int i = 1; i < t; i++){
                if(p[i].l <= end){
                    longer = p[i].r - start;
                    end < p[i].r ? end = p[i].r : end;    //更新了连续区间事要更新重点
                    if(longer > max1)
                        max1 = longer;
                 }
                else{
                    last = p[i].l - end;
                    end = p[i].r;             //更行了间断区间时要更新起点
                    start = p[i].l;
                    if(last > max2)
                        max2 = last;
                    longer = p[i].r - p[i].l;
                    if(longer > max1)
                        max1 = longer;
                }
            }
            printf("%d %d\n", max1, max2);
        }
    }
    return 0;
}
时间: 2024-10-09 12:09:42

USACO s1.2.Milking Cows(求最长连续时间和最长间断时间)的相关文章

USACO 1.1 Milking Cows

Milking Cows 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 a

USACO Section1.2 Milking Cows 解题报告

milk2解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] N个农民,每个农民从L[i]到R[i]时间给奶牛挤奶.问最长的一直有人挤奶的时间,和最长的没有人挤奶的时间.[数据范围] 1<=N

USACO 1.2 Milking Cows (枚举)

标记数组(哈希) 1e6的范围,开一个char数组全然能够,有人为1,无人为0,注意边界就可以.最后线性扫描就可以. 时间复杂度,应该是O(n),n为最后结束的时间. 缺点就是--比較慢 /* ID:twd30651 PROG:milk2 LANG:C++ */ #include<iostream> #include<fstream> #include<string.h> #include<stdlib.h> char a[1000001]; using n

USACO milking cows

题意是给你一个工人挤奶的时间, 然后让你求出最长连续工作时间和最长连续不工作时间..离散化后直接扫一遍即可: /* ID: m1500293 LANG: C++ PROG: milk2 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n; int x[2*5000 + 100]; int num; struct Person { int x, y;

Codeforces 527C Glass Carving (最长连续0变形+线段树)

Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glass). He already has a rectangular w mm ?×? h mm sheet of glass, a diamond glass cutter and lots of enthusiasm. What he lacks is understanding of what t

USACO SECTION1 2.1 Milking Cows 简单贪心

题目链接: http://train.usaco.org/usacoprob2?a=p8taXWtZBpU&S=milk2 题目描述: 给出n组数, 求出最长连续有数区间与最长连续无数区间 解题思路: 简单贪心, 先排序, 然后如果有交集判断右端点,如果右端点大则延伸, 否则continue, 如果无交集更新两个ans. 代码: http://train.usaco.org/usacoprob2?a=p8taXWtZBpU&S=milk2 思考: 简单的贪心我的代码却WA了, 记住一切从简

Milking Cows 挤牛奶 USACO 排序 模拟

1005: 1.2.1 Milking Cows 挤牛奶 时间限制: 1 Sec  内存限制: 128 MB提交: 15  解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 1.2.1 Milking Cows 挤牛奶 (milk2.pas/c/cpp) 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开始2100秒结束.期间最长的至

洛谷P1204 [USACO1.2]挤牛奶Milking Cows

P1204 [USACO1.2]挤牛奶Milking Cows 474通过 1.4K提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 请各位帮忙看下程序 错误 谢… 求大神扫一眼,模拟算法 求帮看看哪儿错 帮忙看看为什么不过 帮我看看哪里错了,挤牛奶,… 帮我看看哪里错了 题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民

POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)

Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14094   Accepted: 6244 Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation,