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