京东第四批笔试Python版

感谢东子,第一次笔试ak,前两题代码没存

第一题 

没啥好说的,区间排个序判一下是否相交即可,选的两个数一定是一样的,第一次交的时候过了70,想了想发现是没判第一个和第三个区间,改了后过了

第二题 

二分每个商品价格最接近的折扣劵即可,不知道折扣的数据是不是非递减的,但我还是把排序后的每一个折扣的满减线与前一个满减线的折扣取了个max,防止满1000元减5元,满100元-50元的情况出现

# 回忆版
def solve():
    n, m = map(int, input().split())
    a = list(map(int, input().split()))
    s = []
    for i in range(m):
        s.append(list(map(int, input().split())))
    s.sort()
    for i in range(1, m):
        s[i][1] = max(s[i][1], s[i - 1][1])
    d = defaultdict(int)
    for i in s:
        d[i[0]] = i[1]
    ans = 0
    temp = sorted(i[0] for i in s)
    for i in range(n):
        pos = bisect_right(temp, a[i])
        if pos == 0:
            ans += a[i]
        else:
            ans += a[i] - d[temp[pos - 1]]
    print(ans)

第三题 

基础不牢,地动山摇。看数据范围一眼O(mnlog(min(m, n)), 应该是需要个二分,想了一个多小时怎么在二维数组里面二分,忘了,半天没想出来,最后半小时决定先把骗分的写上,快速敲完发现py写O(mn * min(n, m))能过26,后来又交了遍过了23(评测机还是一如既往的抖,不过也有可能是py的锅),正当我打算换python3并且加一点读入优化交一遍的时候,发现把最后一层循环起始点(正方形的边长)换成n // 2能过93,大惊,又试着卡了卡数据,就。。。全过了。。数据太弱了,你还我一个多小时的光阴

def solve():
    n, m = map(int, input().split())
    a = []
    for i in range(n):
        a.append(list(map(int, input().split())))

    s = [[0] * (m + 1) for _ in range(n + 1)]

    # 按主对角线编号,以(1,m)为第1号,每个格子属于第abs(i - 1) + abs(j - m) + 1号
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            s[i][j] = s[i][j - 1] + a[i - 1][j - 1]

    for i in range(1, n + 1):
        for j in range(1, m + 1):
            s[i][j] += s[i - 1][j]
    tot = s[n][m]
    # for i in range(n + 1):
    #     print(*s[i])
    ans = 1 << 64
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            for k in range(max(m // 2 - 10, 0), min((n - i), (m - j)) + 1):
                ii = i + k
                jj = j + k
                if k == 0:
                    ans = min(ans, abs(a[i - 1][j - 1] - (tot - a[i - 1][j - 1])))
                    continue
                res = s[ii][jj] - s[ii][j - 1] - s[i - 1][jj] + s[i - 1][j - 1]
                ans = min(ans, abs(res - (tot - res)))
    print(ans)
solve()


注释是原来的思路,想了半天没想出好的处理方式

#我的求职思考#
全部评论
半年没写过题了,看了别人的正解发现自己还是太菜了
点赞 回复 分享
发布于 2023-09-02 14:16 上海
第二题系统炸了,一直在转圈无法提交😅
点赞 回复 分享
发布于 2023-09-02 14:18 广东
怎么 我n方的复杂度的还只能过10呢 虽然常数大了一点
点赞 回复 分享
发布于 2023-09-02 16:49 上海

相关推荐

我在朝九晚六双休的联想等你:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务