笔试(京东)股票出售问题

解析2020年京东测试岗暑期实习生编程题,涉及股票抛售策略的算法设计,通过排序和分组计算最小亏损额,分享了解题思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2020京东测试岗暑期实习生4.18场编程题第二题
题目分选择30道(60)和编程两道(40)
1.题目

最近经济不景气,小A准备将持仓的股票抛售一部分,他共持有n支股票,受交易平台的限制,他每天最多只能卖出m支股票,已知第i支股票每天会亏损a_i元,即如果第k天抛售这支股票,亏算的数额是k*a_i元。
现在他还没有决定具体卖出多少支股票,所以他会给你若干个询问,即如果卖出q支股票,这q支股票最少的亏损数额是多少元。

输入第一行包含两个正整数n和m,表示小A持仓的股票数量和每天最多能卖出的股票数量。(1<=n,m<=50000)
输入第二行包含n个正整数,第i个a_i表示第i支股票每天的亏损数额。
(1<=a_i<=50000)
接下来一行有一个正整数Q,表示询问的数量。(1<=Q<=50000)
之后有Q行,每行有一个正整数q,表示假如要卖出q支股票,最少的亏损数额是多少元。(q<=n)
输出:
对于每个询问,输出对应的结果

示例一:
输入:

5 2
1 2 3 4 5
2
3
5

输出:

7
22
提示:
一共有5支股票,每天最多可以抛售2支,q为2,即有两个询问,
针对第一个询问3,需要抛售3支股票,当选择第1、2、3号股票时损失最小。
其中第一天抛售2、3号股票,损失为5元;第二天抛售1号股票,损失为2元,最后合计损失7元。
针对第二个询问5,需要抛售第1、2、3、4、5支股票,第一天抛售4、5号股票,损失为9元,第二天抛售2、3号股票,损失为10元,第三天抛售1号股票,损失为3元,最后合计损失22元。

2.思路如下:
每天最多卖m支,总共卖出q支,
(1)这q支无论分几天卖出,这q支一定从n支股票的亏损值从小到大排序的前q支取出
(2)再判断卖了几天 q//m天每天均卖出m支,q%m支股票最后一天卖出
q支股票按从大到小排序 根据是第几天卖出的计算每支股票的损失

其实最后问题转化为一个从大到小的数组,划分成q段,每段m个数字,最后一段可小于q
数字*段号 求和

3.代码如下:

    a1 = sorted(a)
    b = []
    for i in range(q):
        b.append(a1[i])
    b1= sorted(b,reverse=True)
    d = [] 
    res = []
    for i in range(len(b1)):
        if (i+1)%m == 0:#整除
            d.append((i+1)/m)
        else:
            d.append((i+1)//m+1)
        res.append(b1[i]*d[i])
    print(sum(res))

ps:问题转化的过程感觉是最有意思的,也不知道我的思路正不正确,考试都没时间写这道题真遗憾,想起高中老师的一句话,考试其实考的是熟练程度。样例倒是都通过了,好开心的说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值