poj3616 解题报告

poj 3616 Milking Time http://poj.org/problem?id=3616

题目大意,farmer John 要给女主牛 挤奶了。挤奶时间 N (1 ≤ N ≤ 1,000,000) hours,注意Bessie进了一间黑心企业,每次挤奶休息完R (1 ≤ R ≤ N)hours后,又可以挤。然后farmer John 有M个时间段,开始时间s,结束时间e,一旦开始就不能停下,直到挤完奶。在这些时间段里可以给Bessie挤奶,但每个时间段的效率不同,有个挤得多一点,有得少一点。现在你的任务是根据famer john的时间段,选择搭配起来最有效率的时间段来让Bessie产奶最多。

一开始,我想根据Bessie挤奶时间N来dp,定义dp[i]为第i个时刻里,产奶最多。但是,TLE后,发现N 能取 10^6,就算少一点,两层循环铁定超时了,只能换一种dp。

上网找解题报告,大家都是根据区间来dp。这样可以大大减少枚举次数。

定义dp[i] 第i个区间里,挤奶最多。

对区间按开始时间从小到大排序后,枚举i个区间,里面枚举小于i的区间。如果i-1个区间里的有某个区间的结束时间+休息时间 <= i区间的开始时间,比较。

定义一个区间的结构,当一个东西都多个属性,可以定义一个结构这样便于管理。为了方便,顺便重载小于运算符,这样可以直接调用stl 的sort函数。

以下是个人认为写得最好的解题报告,可能我理解力不行吧。不班门弄斧了:http://www.hankcs.com/program/cpp/poj-3616-milking-time.html,这个网站有很多解题报告,个人认为写得都很通俗易懂。

你可能感兴趣的:(poj解题报告)