【发布时间】:2012-12-18 14:00:36
【问题描述】:
问题来了:
拉穆是个懒惰的农民。他从父亲那里继承了一个相当大的农场和一所漂亮的房子。拉木将农田出租给他人,收入颇丰。他的父亲曾经在家里养一头水牛并卖掉它的牛奶,但水牛在他父亲死后几天就死了。
Ramu 也想从水牛身上赚点钱,但方式完全不同。他决定他的未来在于投机水牛。在他村里的市场上,每天都有水牛买卖。价格在一年中波动,但在任何一天价格始终相同。
他决定在价格低的时候买水牛,在价格高的时候卖掉它们,在这个过程中积累大量的财富。不幸的是,他的房子只能容纳一头水牛,因此他在任何时候最多只能拥有一头水牛。
在他进入水牛市场之前,他决定检查一下过去几天水牛价格的变化,并确定他可以赚取的最大利润。假设,过去 10 天一头水牛的价格变化为10 12 8 11 11 10 12 15 13 10
Ramu 是个懒惰的家伙,他估计在过去的 10 天里他最多愿意去市场 5 次(每次要么买卖一头水牛)。鉴于此,他可以赚取的最大利润是 9 卢比。为此,他在第 1 天买了一头水牛,第 2 天卖出,第 3 天再买一头,第 8 天卖出。如果他不那么懒惰,愿意去市场 6 次,那么他本可以赚更多的钱。他本可以在第 1 天买入,在第 2 天卖出,在第 3 天买入,在第 4 天卖出,在第 6 天买入并在第 8 天卖出,以赚取 10 卢比的利润。
你的任务是帮助 Ramu 计算他通过投机水牛可以赚取的最大金额,给定一段时期内每日水牛价格的历史记录,以及 Ramu 在此期间愿意进入市场的次数的限制。输入格式
输入的第一行包含两个整数 N 和 K,其中 N 是价格数据可用的天数,K 是 Ramu 愿意访问牛市的最大次数。接下来的 N 行(第 2、3、...、N+1 行)每行都包含一个正整数。第 i+1 行的整数,1 ≤ i ≤ N,表示一头水牛在第 i 天的价格。输出格式
一个非负整数,表示如果 Ramu 最多进行 K 次进入市场,他可以赚取的最大利润。
您可以假设 N ≤ 400 和 K ≤ 400。
时间限制 = 3 秒。
如果我们没有约束 k,我们可以使用贪心方法解决这个问题,
while c < N
i = c
while price[day i] > price[day i+1] increment i;
j = i+1
while price[day j] < price[day j+1] increment j;
add price[day j] - price[day i] to out profit
c = j+1
但我们不能在这里使用它,因为是否在特定日期访问取决于我们访问了多少天。 这是我尝试过的
//Store all the pairs generated in the previous algorithm in a linked list L, each
//element has two attributes buy,sell
while length of L > k/2
find an element i in the list such the (L[i].sell- L[i-1].buy) -
(L[i-1].buy - L[i-1].sell) - (L[i].buy - L[i].sell) is maximized.
Then set L[i-1].sell to L[i].sell and delete i from the list
这是一个在线法官的问题,当我提交它时,我的一些测试用例超出了时间限制,一些测试用例的答案错误,只对一个测试用例进行了纠正。
我的方法有什么问题,它怎么会很慢,因为它需要大约 O(NK) 时间,其中 N 和 K 如何改进我的算法以正确解决问题?
编辑:这不是作业,我在这里发现了这个问题:http://opc.iarcs.org.in/index.php/problems/BUFFALOES
【问题讨论】:
-
@niklas-r 这不是作业我在网上的评委上读到这个问题:opc.iarcs.org.in/index.php/problems/BUFFALOES
-
@NiklasR 'homework' 是一个已弃用的标签,即使它不是你也无权添加它。
-
提示:最好的解决方案只需要 1 毫秒
标签: c algorithm dynamic-programming greedy