Milking Cows

Description

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

Input

Line 1: 一个整数N。 Lines 2..N+1: 每行两个小于1000000的非负整数,表示一个农民的开始时刻与结束时刻。

Output

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

Sample Input

3
300 1000
700 1200
1500 2100

Sample Output

900 300

解题思路:贪心策略,先按挤牛奶的开始时间升序,开始时间相同,按结束时间升序。如果后面一人的开始时间小于前面一人的结束时间,说明这段时间内至少有一个人在挤牛奶,那么把后面一人的结束时间更新为新的至少一人挤牛奶时间段的结束时间,以此类推;反之后面一人开始时间大于前面一人的结束时间,说明存在无人挤奶时间,需要记录先这一段时间,存入数组中。最后找到最大的至少一人挤奶时间和无人挤奶时间。

上代码:
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct message
 6 {
 7     int start;
 8     int end;
 9 } a[1000000];
10 int my_comp(message a,message b)
11 {
12     if(a.start<b.start)
13         return 1;
14     else
15     {
16         if(a.start==b.start)
17         {
18             if(a.end<b.end)
19                 return 1;
20             else
21                 return 0;
22         }
23         else
24             return 0;
25     }
26 }
27 int main()
28 {
29     int i,j,n,k=0,g=0,ans1=0,ans2=0;
30     int x[10000],y[10000];
31     struct message t;
32     scanf("%d",&n);
33     memset(x,0,sizeof(x));
34     memset(y,0,sizeof(y));
35     for(i=0; i<n; i++)
36     {
37         scanf("%d%d",&a[i].start,&a[i].end);
38     }
39     sort(a,a+n,my_comp);
40     t=a[0];
41     for(i=1; i<n; i++)
42     {
43         if(a[i].start<=t.end)
44         {
45             if(a[i].end>t.end)
46                 t.end=a[i].end;
47         }
48         else
49         {
50             x[k++]=t.end-t.start;///至少一个人挤奶
51             y[g++]=a[i].start-t.end;///无人挤奶
52             t.start=a[i].start;
53             t.end=a[i].end;
54         }
55     }
56     if(k==0)///只有一个人时
57     {
58         x[k++]=t.end-t.start;
59     }
60     for(i=0; i<k; i++)
61     {
62         if(x[i]>ans1)
63             ans1=x[i];
64     }
65     for(i=0; i<g; i++)
66     {
67         if(y[i]>ans2)
68             ans2=y[i];
69     }
70     printf("%d %d\n",ans1,ans2);
71     return 0;
72 }


原文地址:https://www.cnblogs.com/wkfvawl/p/8715808.html

时间: 2024-10-15 00:29:54

Milking Cows的相关文章

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

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

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

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秒结束.期间最长的至

USACO Milking Cows(模拟)

题目请点我 题意: 题意很简单,最开始的时候想要用优先队列存储时间,用map存储对应时间起点与终点.按时间轴顺序排列的思路是没错的,但是忽略了很重要的一点,一个时间起点可能会有多个对应的时间终点.改用结构体存储,定义cmp,得到时间轴.有两个变量表示总的时间起点和终点,注意起点与终点变换的条件,不断向后遍历就可以了. 代码实现: /* ID: eashion LANG: C++ TASK: milk2 */ #include <iostream> #include <cstdio>

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;

Section 1.2.2 Milking Cows

= =之前跟队友兴致勃勃说要一起刷usaco,然后就卡在这题了,因为真没看懂. 今天莫名想起,感觉是左闭右开区间,然后一试就过了= = 然后又可以愉快开刷了 //然而队友已经不是原来的队友了 //人和人的价值观差别太大 //我觉得玩的开心就好+信守承诺最重要 //他觉得要当一队拿金然后进final最重要 //另一个迷之乱入的觉得和他妹子打+不离开原队友最重要,好吧 = = //另外一个人迷之乱入的我也不知道他觉得什么重要,然而我信守对他承诺,以至于抛弃了队友(抱歉),然而他却背弃了呵呵呵,和学霸

USACO Section1.2 Milking Cows 解题报告

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

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了, 记住一切从简

[USACO1.2]挤牛奶Milking Cows

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