9.23 华为笔试

9.24 update: 更新简单题解

#1 某种数学运算

import math
def s(c):
    n = math.floor(math.sqrt(c + 0.75) - 0.5)
    s = c - n ** 2 - n
    r = 2 * n
    if s > n:
        r += 1
    return r
print(s(int(input())))

本地计算结果,发现呈现 [0, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8 ...] 的关系,推公式按照 c 反推 n 即可。

#2 某种 DP

n = int(input())
m = []
for i in range(2):
    m.append(list(map(int, input().split())))
c = [0]
d = [0]
for i in range(n):
    c.append(c[-1] + m[1][i])
    d.append(d[-1] + m[0][n - 1 - i])
result = float('inf')
for i in range(n):
    t = max(c[i], d[n - 1 - i])
    result = min(t, result)
print(result)

     A |x|  C 
  ------------
     D |y| B

小华走 A + x + y + B,小为走 max(C, D), 小华会选择最小的 max(C, D)。

#3 某种模拟

import bisect

[n, x, y] = map(int, input().split())
a = list(sorted(map(int, input().split())))
for i in range(n):
    a[i] = max(0, a[i] - i)
count = 0
index = 0
while x < y:
    index = bisect.bisect(a, x)
    if index == n:
        count += y - x
        break
    base = 2 * index - n
    target = min(a[index], y)
    diff = target - x
    if target == y and diff <= index:
        count += diff
        break
    if base < 0:
        count = -1
        break
    t = diff // base
    count += t * n
    x += base * t
print(count)

每次都要把所有的都打了之后才可以开始下一轮,因此先打等级低的。每轮的收益和当前能打过的人数有关系。之后模拟即可。

#华为#
全部评论
我要凉了
点赞 回复 分享
发布于 2023-09-23 20:50 北京
这是标准答案吗?
点赞 回复 分享
发布于 2023-09-23 21:02 北京
第一题什么思路
点赞 回复 分享
发布于 2023-09-23 21:02 北京
第二题题目是什么,你的这个代码AC了吗
点赞 回复 分享
发布于 2023-09-23 21:15 河北
华为的题目可以在力扣上找到原题吗
点赞 回复 分享
发布于 2023-09-23 21:16 北京
使劲改,到最后也没凑够150,寄了
点赞 回复 分享
发布于 2023-09-23 21:17 北京
woc怎么八点半就有答案了
点赞 回复 分享
发布于 2023-09-23 21:19 北京
大佬求思路讲解一下,我已经凉了
点赞 回复 分享
发布于 2023-09-23 21:21 北京
这个模拟真是没看明白,万诺也发了题解,后面一头雾水
点赞 回复 分享
发布于 2023-09-23 23:37 上海
请问每个题能有多少时间做题呢
点赞 回复 分享
发布于 2023-09-24 00:08 浙江
a[i] = max(0, a[i] - i) 请问第三题的这一行代码是啥意思呀?没看懂
点赞 回复 分享
发布于 2023-09-24 21:57 北京
佬,投的啥部门啊啊啊
点赞 回复 分享
发布于 2023-09-25 20:26 重庆

相关推荐

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