顺丰笔试 2023-9-26

第一题:一个项目组有n人,所有人的能力表示为数组A,现有一任务M,M为完成该任务所需要的能力。可以分成多个小组完成,每个小组包含k人(1<=k<=n),设小组中能力最强者的能力为Ai_max,该小组需满足k*Ai_max>=M,求最多分成多少个小组同时完成任务M。

思路:比较简单,略。

def max_groups_to_complete_task(A, M):
    # 首先,将能力数组A按升序排序
    A.sort(reverse=True)

    # 初始化小组数为0
    groups = 0

    # 迭代数组A,形成小组
    n = len(A)
    i = 0
    left = 0
    right = n - 1
    while left <= right:
        cur_sum = 0
        add_item = A[left]
        while left <= right:
            cur_sum += add_item
            if cur_sum >= M:
                groups += 1
                left += 1
                break
            right -= 1

    return groups


# 示例
A = [82, 45, 37, 121, 55]
M = 100
result = max_groups_to_complete_task(A, M)
print("最多可以分成 {} 个小组同时完成任务M。".format(result))

第二题:我打算买些糖果,A数组是需要每类糖果的数量,B数组是每类糖果可以打折销售的最小数量。

商店里每类糖果一颗2元,所购买的糖果总数达到一定数量后,某个种类的糖果将降价到1元销售。

求最后所需花费的金额。

如A=[ 2, 3, 2, 1], B=[ 1, 3, 4, 1],下标0~3,其中,先买一颗第2类糖果,花费2元,第2类糖果还剩2-1=1颗;

此时,第0类和第3类都可以折扣购买,共花费3元;然后,已购买数量为4颗,则第1类和第2类糖果同样可以折扣购买,花费4元。

共花费9=2+3+4

思路:使用2元单价购买所有糖果的花费减去用1元折扣价购买的糖果数量即为所求。

用字典键代表该类糖果折扣数量要求,值代表该类糖果所需数量。

# 将字典的键统一减少一个值
def minusKey(dic, minus_value):
    new_dic = {}
    for key, val in dic.items():
        new_dic[key - minus_value] = val
    return new_dic


# 获取字典的所有键大于0部分
def positiveKey(dic):
    new_dic = {}
    for key, val in dic.items():
        if key > 0:
            new_dic[key] = val
    return new_dic


A = [16, 18, 20]
B = [12, 10, 15]
counter = {}
# 将B元素值作为键,相同项合并
for b, a in zip(B, A):
    if b not in counter:
        counter[b] = a
    else:
        counter[b] += a

# 以2元购买所有所需的糖果
total = sum(A) * 2
# 以1元购买的糖果数量
discount = 0
# 找到最大键和最小键
while 1:
    if len(counter) > 1:
        minb = min(counter.keys())
        maxb = max(counter.keys())
        # 如果最大键对应的值(即所需购买的糖果数量)小于最小键
        if counter[maxb] < minb:
            tmp = counter[maxb]
            del counter[maxb]
            counter = minusKey(counter, tmp)
        else:  # 如果最大键对应的值(即所需购买的糖果数量)大于最小键
            counter[maxb] -= minb
            counter = minusKey(counter, minb)
            counter = minusKey(counter, counter[0])
            for k, v in counter.items():
                if k <= 0:
                    discount += v
            counter = positiveKey(counter)
    elif len(counter) == 1: # 只剩一个键值对时,折扣数量要求小于所需数量才需要增加discount
        for k, v in counter.items():
            if k < v:
                discount += (v - k)
    break
res = total - discount
print(res)

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 13:35
虽然不怎么光彩,经过这件事,可能我真的要去认同“面试八股文早该淘汰!不会用AI作弊的程序员=新时代文盲!”这句话了
HellowordX:Ai的出现是解放劳动力的,不是用来破坏公平竞争环境的,这样下去,轻则取消所有线上面试,严重了会影响整个行业对所有人产生影响,企业会拉高入职考核各种离谱考核会层出不穷
你找工作的时候用AI吗?
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务