USACO训练场1.3 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 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):
The longest time interval at least one cow was milked.
The longest time interval (after milking starts) during which no cows were being milked.
大致思路:
先按每个farmer的开始时间从小到大排序,然后会有以下几种情况。
- farmer2的开始时间<=farmer1的结束时间,例如farmer1(100,700),farmer2(500,1200)
- farmer2的开始时间>farmer1的结束时间,也就是说两个farmer的时间段没有相交,例如farmer1(100,200),farmer2(400,500)
- farmer2的时间段包含在farmer1里,例如farmer1(100,1200),farmer2(300,500)
首先用一个变量cnt_ed来存储上一个farmer的结束时间,然后判断当前这个farmer的起始时间是<=上个farmer的结束时间还是>上个farmer的结束时间,这里有个if和else的分支。
如果当前farmer的起始时间<=上个farmer的结束时间,也就是说个时间段有覆盖关系,先要再判断一下这个farmer的开始和结束的时间段是不是被包含在了上个farmer的开始和结束时间段里,例如,上个farmer(100,1300),这个farmer(200,600),如果存在这种包含关系,就是上面说的情况3,那么就直接continue。如果不存在包含关系,那么一个临时存储答案的变量