标题:一道编程题 求解决
只看楼主
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
结帖率:96.88%
已结贴  问题点数:8 回复次数:13 
一道编程题 求解决


股神巴菲特在小时候就极具投资天赋。当时他手上有一些资金,想去股票市场做做交易。

给出一支股票在 N 天之内每天的交易价格,假设每天的交易价格唯一且一定能成交,不需要任何手续费等其他费用,并且小巴菲特的初始资金量充足。

规定小巴菲特N天之内只能且必须先买一股然后卖一股,两次交易可以在同一天完成也可以不在同一天完成。

请帮小巴菲特计算出 N 天之后最多能赚多少钱?
输入格式

第 1 行:一个整数 T (1≤T≤10) 为问题数。

对于每组测试数据:

第 1 行是 1 个正整数:天数 N ( 0<n≤500 )。

第 2 行 N 个正整数,每个正整数 Xi(0<i≤N, 0<xi≤10000) 表示第 i 天该股票每股的交易价格。
输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。然后在一行输出小巴菲特最多能赚的钱数。
样例
Input

3
6
9 6 5 4 2 1
5
9 23 1 3 1
60
4326 4775 3962 5995 6045 6906 6539 7789 7874 3923 8134 2269 582 7872 8255 7577 7176 8534 2460 4451 7464 8690 2168 5564 7774 2060 5106 6974 268 304 7179 8560 193 6656 7968 118 2751 3204 2981 200 64 932 9155 1140 2052 7543 738 4230 9758 6925 5275 2678 5809 3754 199 9539 1172 2643 6572 7890

Output

case #0:
0
case #1:
14
case #2:
9694

搜索更多相关主题的帖子: 格式 正整数 case 编程 输出 
2019-12-16 23:03
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
从学校的acm网站里找的
我的想法是先定义数组,找出最大的元素,再往前推最小的元素,之后继续这个过程,但是水平有限,写不出代码 哭了

我想要两颗西柚。
2019-12-16 23:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:2 
错了,删除之


[此贴子已经被作者于2019-12-17 08:12编辑过]

2019-12-16 23:35
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
回复 3楼 rjsp
为什么只求差行的最大值呀,如果第一天买进第二天卖出赚了,那么第三天依然可以买进然后第四天再卖出呀,还是盈利的

我想要两颗西柚。
2019-12-16 23:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 4楼 komorebi0110
9 23 1 3 1
为什么结果是 14,难道不应该是 23-19 + 3-1 = 16 吗?
2019-12-17 08:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用komorebi0110在2019-12-16 23:42:35的发言:

为什么只求差行的最大值呀,如果第一天买进第二天卖出赚了,那么第三天依然可以买进然后第四天再卖出呀,还是盈利的

假设这N天只允许买卖一次,那么代码是
程序代码:
#include <stdio.h>
#include <limits.h>

int main( void )
{
    unsigned t;
    scanf( "%u", &t );
    for( unsigned i=0; i!=t; ++i )
    {
        unsigned n;
        scanf( "%u", &n );

        unsigned minval = UINT_MAX;
        unsigned maxdelta = 0;
        for( unsigned j=0; j!=n; ++j )
        {
            unsigned val;
            scanf( "%u", &val );

            if( minval > val )
                minval = val;

            unsigned delta = val - minval;
            if( maxdelta < delta )
                maxdelta = delta;
        }

        printf( "case #%u:\n%u\n", i+1, maxdelta );
    }
}
那么运行结果符合题目中给的样例

假设这N天允许买卖多次,那么代码是
程序代码:
#include <stdio.h>
#include <limits.h>

int main( void )
{
    unsigned t;
    scanf( "%u", &t );
    for( unsigned i=0; i!=t; ++i )
    {
        unsigned n;
        scanf( "%u", &n );

        unsigned base = UINT_MAX;
        unsigned sum = 0;
        for( unsigned j=0; j!=n; ++j )
        {
            unsigned val;
            scanf( "%u", &val );

            if( val > base )
            {
                sum += val-base;
                base = val;
            }
            else if( val < base )
            {
                base = val;
            }
        }

        printf( "case #%u:\n%u\n", i+1, sum );
    }
}
那么运行结果符合题目中给的样例
2019-12-17 08:49
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:2 
似乎可以分解为两种情况
1     :  1到3天的价格呈现递增趋势,第1天可以买入,第3天卖出,则有盈利
2     :  3到5天的价格呈现递减趋势,3,4这两天则不能买入。
2019-12-17 12:55
鱼儿小仙
Rank: 1
等 级:新手上路
威 望:1
帖 子:3
专家分:2
注 册:2019-8-12
得分:2 
默默地问一句,递归可以做吗?
我怕递归过深,把栈给爆了!
2019-12-17 16:57
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
如果有思路可以把代码写一下,我放进去看一下能不能Accepted

我想要两颗西柚。
2019-12-17 18:35
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
回复 6楼 rjsp
好像都没有accepted

我想要两颗西柚。
2019-12-19 01:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-498444-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.101283 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved