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秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位):

  • 最长至少有一人在挤奶的时间段。
  • 最长的无人挤奶的时间段。(从有人挤奶开始算起

文件名: milk2

输入:

(file milk2.in)

Line 1:

一个整数N。

Lines 2..N+1:

每行两个小于1000000的非负整数,表示一个农民的开始时刻与结束时刻。

输出:

(file milk2.out)

一行,两个整数,即题目所要求的两个答案。

SAMPLE INPUT
3
300 1000
700 1200
1500 2100
SAMPLE OUTPUT
900 300

提示

来源/分类

USACO-01

我的天哪 这道题难道有那么难吗

有n(<=5000)个区间

这n个区间在0-100 0000之间

p.s.个人认为就是个简单的排序+模拟。。。

我想的是先把这些区间按照起始时间排一个序(快排比较简单吧nlogn)

So?设一个指针从0-时间的最大值    跑一遍  再+100 0000    那肯定超时啊。。。。

看来这么整不行  呜呜呜~~~~

嗷嗷嗷好像明白了   在1-100 0000之间其实还是有很多点没有扫到

而且既然直接从1-100 0000扫会超时  只要把n个区间的起始点排好序以后 把这n个区间从前往后扫一遍不就OK了吗    +5000肯定不超时啦!!!(暗暗地说:对呀!!天哪我刚才咋么没想到!)

那在扫的时候怎么模拟呢?

emmmm。。。

沉思片刻 再看看题吧

最长至少有一人在挤奶的时间段。

最长的无人挤奶的时间段。(从有人挤奶开始算起

第一个只要打一个擂台就行了 在从前往后枚举区间的时候看看有没有接起来或者重叠    其实也就是是否相连

再简单一点就是判断当前区间的起点是否小于等于tmpend 然后tmpend每次和当前区间打擂台取一个最大值

第二个。。天哪咋办。。原地懵圈

停停停再想想O(∩_∩)O哈哈~

如果当前区间的begin比tmpend大

那就相当于不相连了  而且可以保证这之间没有别的区间进来掺和了

为甚么呢》

其实也很简单  tmpend其实存的也就是到当前区间为止最大最靠后的区间的end值

那么最靠后的在tmpend  那tmpend~当前枚举区间的begin之间当然就没有别的区间啦

6666

敲一敲试试吧

AC了!

我的代码变量名可能很通俗易懂 O(∩_∩)O哈哈~

还有一个非常重要的问题

以后打擂台的时候假如要寻找最大值

初始的maxn一定要设成0 别设成-1 比如这一个题的最长的无人时间 可能每时每刻都有人啊  那你要是一开始的时候设得-1就输出了-1  其实应该是 0 !

下一次不要再犯错误了(~ ̄▽ ̄)~

#include<bits/stdc++.h>
using namespace std;
struct Node{
    int Begin,End;//结构体大法好
}milk[5005];
int cmp(Node a,Node b){
    return a.Begin<b.Begin;//其实那个End不用考虑啊
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&milk[i].Begin,&milk[i].End);
    sort(milk+1,milk+n+1,cmp);//sort排序一下 再加一个cmp
    int tmpend=milk[1].End   ,   max_at_least_1=milk[1].End-milk[1].Begin   ,   max_nobody=0;
    int at_least_1_tot=milk[1].End-milk[1].Begin;
    for(int i=2;i<=n;i++){
        if(milk[i].Begin<=tmpend){//区间相连
            if(milk[i].End>=tmpend)
                at_least_1_tot+=milk[i].End-tmpend;
            tmpend=max(tmpend,milk[i].End);
        }
        else{//有空隙
            max_at_least_1=max(max_at_least_1,at_least_1_tot);//取最大值
            at_least_1_tot=milk[i].End-milk[i].Begin;//还原重新累计
            max_nobody=max(max_nobody,milk[i].Begin-tmpend);
            tmpend=max(tmpend,milk[i].End);
        }
    }
    printf("%d %d", max_at_least_1 , max_nobody );

    return 0;
}

原文地址:https://www.cnblogs.com/Tidoblogs/p/11291670.html

时间: 2024-11-03 16:13:19

Milking Cows 挤牛奶 USACO 排序 模拟的相关文章

codevs——1385 挤牛奶

1385 挤牛奶 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 查看运行结果 题目描述 Description 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻.第二个农民在700时刻开始,在 1200时刻结束.第三个农民在1500时刻开始2100时刻结束.期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的

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

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

【USACO 1.2.1】挤牛奶

[问题描述] 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻.第二个农民在700时刻开始,在 1200时刻结束.第三个农民在1500时刻开始2100时刻结束.期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300时刻(从1200时刻到1500时刻). 你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000

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

【USACO1.2.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

NYOJ 179 LK&#39;s problem (排序模拟)

链接:click here~~ 题意: 描述 LK has a question.Coule you help her? It is the beginning of the day at a bank, and a crowd  of clients is already waiting for the entrance door to  open. Once the bank opens, no more clients arrive, and  tellerCount tellers be

acm集训训练赛B题【排序+模拟】

一.原题 Description Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you

zoj3780 Paint the Grid Again 拓扑排序模拟

比赛时候看完题目就觉得是拓扑排序,当时心里隐隐觉得跟相框叠加那个题有点相似的 然后wzy问我no solution 是什么情况,我就一直去想是不是构成了什么排列就一定是no solution 其实只用再参考相框叠加那个题往前想一丁点就够了,就是从最后涂的那一层开始往前找,每一次都必然有一行或一整列是一样的 每次按逆字母序删除这一行或列就是了. 拓扑排序的题总是类似而且简单的,找到关系,敲代码完全不存在问题. #include <iostream> #include <cstring>

Milking Cows

Description 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻.第二个农民在700时刻开始,在 1200时刻结束.第三个农民在1500时刻开始2100时刻结束.期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300时刻(从1200时刻到1500时刻). 你的任务是编一个程序,读入一个有N个农民(1 <= N <=