京东数据分析笔试编程(原题复制)

第一题我就用贪心暴力做的,感觉挺菜的做法,最开始AC了27%,后来就多加了一个day_loss变量(原本每个循环都是sum_loss+=d*a[i]),先做加法再做乘法,突然全AC了。。🤣有一些改进吧,但是全AC不知道是我改进的原因还是赛码的原因。
第二题不会做😅,希望有大佬可以分享一下解题方法。

第一题

#最近经济不景气,小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<=10000)
#接下来一行有一个正整数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*1=2元;最后合计损失为7元。
#针对第二个询问5,需要抛售第1、2、3、4、5号股票。其中第一天抛售4、5号股票,损失为9元;第二天抛售2、3号股票,损失为2*2+2*3=10;第三天抛售1号股票,损失为3*1=3元;最后合计损失22元。

import math

n, m = map(int, input().split())
a = list(map(int, input().split()))
a.sort(reverse=True)
p = int(input())
for pi in range(p):
    q = int(input())
    max_day = math.ceil(q/m)
    sum_loss = 0
    i = n - q
    for d in range(1, max_day):
        day_loss = 0
        for mi in range(m):
            day_loss += a[i]
            i += 1
        sum_loss += day_loss*d
    for mi in range(q - m*d):
        sum_loss += max_day * a[i]
    print(sum_loss)

第二题

#一共有n个格子从左到右排成了一行,从1~n编号。第 i 个格子上写着一个正整数a[i]。
#一开始你在1号格子,并且手里有一个数字h0。
#当你在第 i 号格子,手里有数字 h 的时候,你有两个选择:
#(1)跳到第i + h号格子,手中的数字依然是h;
#(2)跳到第i + a[i]号格子,手中的数字变成a[i];
#在跳跃的过程中是不允许超出n号格子的。
#你想知道一共有多少种不同的路径,可以从1号格子跳到n号格子,两条路径是不同的当且仅当它们经过的格子集合是不同的。输出不同路径的条数除以998244353的余数。
#输入
#第一行包含两个整数n和h0;
#第二行包含n个正整数a[i];
#2 <= n <= 1000, 1 <= a[i], h0 <= n - 1

#样例输入
#5 1
#2 3 2 4 3
#样例输出
#4
#
#
#提示
#输入样例2
#3 10
#10 10 10
#
#输出样例2
#0


#京东##笔试题目##数据分析工程师#
全部评论
赛码有毒
点赞
送花
回复 分享
发布于 2020-04-18 21:54
这样为啥就能过呢,看不懂有什么区别啊。。。。
点赞
送花
回复 分享
发布于 2020-04-18 22:22
国泰君安
校招火热招聘中
官网直投
第二题我用递归解的,通过78%,不知道漏了什么case
点赞
送花
回复 分享
发布于 2020-04-18 22:31
用递归f(n,i)=f(n-h,i+h)+f(n-a[i],i+a[i]),这样对不对
点赞
送花
回复 分享
发布于 2020-04-19 01:25
楼主我引用了你的帖子,贴了我自己的代码,https://www.nowcoder.com/discuss/411847
点赞
送花
回复 分享
发布于 2020-04-19 08:47
楼主您好: 第一题最后的部分 for mi in range(q - m*d):         sum_loss += max_day * a[I] print(sum_loss) 在sum_loss +=的下一行是不是应该还有一句i += 1呀
点赞
送花
回复 分享
发布于 2020-05-04 17:06
from collections import deque n, h0, *nlst = map(int, open(0).read().strip().split()) q = deque([[0, h0]]) res = 0 while q:     cur, h = q.popleft()     if cur + nlst[cur] == n - 1:         res += 1     elif cur + nlst[cur] < n - 1:         q.append([cur + nlst[cur], nlst[cur]])     if nlst[cur] == h:         continue     if cur + h == n - 1:         res += 1     elif cur + h < n - 1:         q.append([cur + h, h]) print(res % 998244353)
点赞
送花
回复 分享
发布于 2020-08-13 00:45

相关推荐

5 56 评论
分享
牛客网
牛客企业服务