请教C++的一个低买高卖算法,注意时间复杂度必须为O(nlogn)的

大智_Unity玩家 2010-04-25 09:54:10
假设你已经通过未来机器知道未来连续n天中棒糖的单价(元/斤),假设在这段时间内,你可以选择某天买进1000斤棒糖,而在之后的某天把它们都卖出去(买卖各一次)——当然,你也可以在这段时间里面不进行任何买卖。如何能够尽可能地挣更多的钱?
算法中可能会用到分治法。

设计一个O(n log n)的算法。(为简单起见,假设n是2的幂,且n<100)
例如:
Input
4
9 1 5 2
Output
2 3

例如:
Input
4
9 7 2 1
Output
no

...全文
295 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
大智_Unity玩家 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tajon1226 的回复:]
空话不说,直接上程序

C/C++ code
#include <iostream>
using namespace std;

int main()
{
int a[14] = {9,3, 1,4,5, 3, 2, 4, 6, 8, 10, 3, 7, 11};

int n = 14;
int i = 0, j = 0;
int gu, ……
[/Quote]
这个明显不对吧,答案应该是第3天买入,第14天卖出的……这个输出是第7天买入,第11天卖出。。。
lingling1989r 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tajon1226 的回复:]
楼主这个问题可形象看成是一个波形的曲线,求波谷到波峰距离最长是多少。
[/Quote]
mark。。
走好每一步 2010-04-26
  • 打赏
  • 举报
回复
时间复杂度为o(n)
走好每一步 2010-04-26
  • 打赏
  • 举报
回复
空话不说,直接上程序
#include <iostream>
using namespace std;

int main()
{
int a[14] = {9,3, 1,4,5, 3, 2, 4, 6, 8, 10, 3, 7, 11};

int n = 14;
int i = 0, j = 0;
int gu, feng, boju, minboju = 0;
while (true)
{
while (a[i+1] <= a[i] && i<n-1)
++i;
//cout << i << " " << a[i] << endl;
j = i;
while (a[j+1] >= a[j] && j<n-1)
++j;
//cout << j << " " << a[j] << endl;
boju = a[j] - a[i];
if (boju > minboju)
{
minboju = boju;
gu = i;
feng = j;
}
if (j==n-1)
break;
i = j;
}
cout << gu+1 << ":" << a[gu] << endl;
cout << feng+1 << ":" << a[feng] << endl;
return 0;
}
走好每一步 2010-04-26
  • 打赏
  • 举报
回复
楼主这个问题可形象看成是一个波形的曲线,求波谷到波峰距离最长是多少。
大智_Unity玩家 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lcl_data 的回复:]
先找到最小的o(n) 输入时就可以判断
找最小的后面最大的一个数0(n)

最后是0(n)
[/Quote]
这个也有问题啊,比如说价格依次是5 2 3 1,那你的程序有运行结果么
ForestDB 2010-04-25
  • 打赏
  • 举报
回复
帮顶。
十八道胡同 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kingstarer 的回复:]

只买卖一次吗? 遍历数组,遍历过程中记录之前获得的最小单价
在每碰上一个大于最小单价的元素时算出能赚多少钱
取能赚钱最多的那一天卖了
[/Quote]
可以有个问题,这个大的数必须在小的数后面

2次查找,每次都是0(n)
结果还收0(n)
十八道胡同 2010-04-25
  • 打赏
  • 举报
回复
先找到最小的o(n) 输入时就可以判断
找最小的后面最大的一个数0(n)

最后是0(n)
大智_Unity玩家 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kingstarer 的回复:]
只买卖一次吗? 遍历数组,遍历过程中记录之前获得的最小单价
在每碰上一个大于最小单价的元素时算出能赚多少钱
取能赚钱最多的那一天卖了
[/Quote]
刚觉这样的话时间复杂度会是O(n2)吧
kingstarer 2010-04-25
  • 打赏
  • 举报
回复
只买卖一次吗? 遍历数组,遍历过程中记录之前获得的最小单价
在每碰上一个大于最小单价的元素时算出能赚多少钱
取能赚钱最多的那一天卖了
kingstarer 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhenghongzhi6 的回复:]
引用 1 楼 kingstarer 的回复:
只买卖一次吗? 遍历数组,遍历过程中记录之前获得的最小单价
在每碰上一个大于最小单价的元素时算出能赚多少钱
取能赚钱最多的那一天卖了

刚觉这样的话时间复杂度会是O(n2)吧
[/Quote]
遍历一次就行了 复杂度是O(n)

例如
2 5 3 1 2
==========
在读到5时可以算出一个单价差为3
读到3时算出单价差为1
读到1时算出单价差为-1
读到2时算出单价差为0
==========
所以得出结论,在第一天买第二天卖收益最大
十八道胡同 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhenghongzhi6 的回复:]

引用 3 楼 lcl_data 的回复:
先找到最小的o(n) 输入时就可以判断
找最小的后面最大的一个数0(n)

最后是0(n)

这个也有问题啊,比如说价格依次是5 2 3 1,那你的程序有运行结果么
[/Quote]
必须先买在卖啊,只能是5 1啊
mujiok2003 2010-04-25
  • 打赏
  • 举报
回复
对冲问题.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧