【发布时间】:2017-01-03 20:06:25
【问题描述】:
假设我们准确预测了梅西在N 天期间的价格。预测以列表形式给出,其中p_i 代表玩家在i 当天的价格。 Bob 计划在此期间进行多次连续交易,但一次只能拥有一个梅西,因此需要在再次购买之前卖掉他。
鲍勃一开始预算有限B,他买不起梅西,因为他买不起。当然,Bob 可以将他从买卖他的 Messis 中获得的任何利润添加到他的预算中。对他来说幸运的是,有些时候他会从事先打开一个随机的礼品包开始。
最后鲍勃只是想尽可能多地获得利润,然后卖掉他最后的梅西。
输入格式:
在输入文件的第一行,你会找到 3 个整数,N、B 和 M。
N 表示 Bob 预测梅西价格的天数。 B 代表 Bob 的初始预算。 M 可以是 0 或 1;如果 Bob 开始时没有要出售的初始梅西,则为 0;如果他确实开始时需要出售的初始梅西,则为 1。
在下一行你会找到 N 个整数:p1, p2, ... , pN,用空格隔开,其中 pi 代表梅西在第 i 天的价格。
给定测试用例
测试 1
7 5 0
20 10 30 5 10 10 20
正确答案:15
解释:Bob 以 5 的初始预算开始,并且没有要出售的初始梅西。在他的价格降到5之前他不能买任何梅西,所以他的利润只有(20-5) = 15
测试 2
7 0 1
20 10 50 80 60 20 10
正确答案:90
说明: Bob 以 0 的初始预算和一个要出售的梅西开始。因此他以20的价格卖掉他最初的梅西,以10的价格买回他并以80的价格卖掉他,因此他的利润是20 + (80-10) = 90
这个问题是在一次采访中给我的,我无法提出一个有效的解决方案。与此同时,我在这个问题上发现了一些更简单的变体,例如 Maximum profit by buying and selling a share at most twice ,但我未能成功理解如何使这种想法适应我的问题。
到目前为止,我只能想出一个蛮力解决方案,它远远超出了我给定的时间限制(C++ 为 0.1 秒,其中 1
我正在寻找解决方案和思考这类问题的方法,我似乎找不到正确的方法来思考这个问题。
【问题讨论】:
-
请解释我的问题是如何跑题的。查看“帮助”部分后,我发现合适的问题可能涉及:特定的编程问题,或软件算法,或程序员常用的软件工具;并且是软件开发独有的实用、可回答的问题
-
一个非常宽泛、没有任何代码的一般问题通常被认为是本网站的题外话,这更多是为了解决代码的特定问题。 softwareengineering.stackexchange.com 可能更适合这个问题。
-
这个问题有多宽泛?这是一个非常具体的问题,具有非常具体的要求。如“主题”部分所述,该问题不需要附加任何代码,只要它基于上述列表中的概念即可。 " 我们认为最好的(不是绝对必要的)Stack Overflow 问题中有一些源代码,但如果您的问题通常涵盖...[以上列表]...**那么您就在提问的好地方!**"
-
对不起,我不太关注。你能把它分解成 1/8 盎司、1/4 盎司、1 盎司等,或者甚至是克。那会很好。
-
投票关闭的用户给出了以下具体原因:“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及最短的在问题本身中重现它所必需的代码。没有明确问题陈述的问题对其他读者没有用。请参阅:如何创建最小、完整和可验证的示例。我也不跟。这与我的问题有什么关系?如果你不能解决一个不会使陈述不正确的问题,那只是意味着你不能解决这个问题。
标签: algorithm dynamic-programming