VIVO:笔试题(20190911)

本文探讨了拆礼盒算法问题,通过栈结构判断左括号匹配情况,以及资源分配问题,利用动态规划解决应用在限定资源下的最大效益问题。

拆礼盒

设立一个栈,判断到字符0为止仍剩余的左括号。所以当匹配到右括号的时候应该出一个左括号与之匹配。

#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
Welcome to vivo !
'''


def solution(s):
    # TODO Write your code here
    stack = []
    for su in s:
        if su == '(':
            stack.append(su)
        elif su == ')':
            stack.pop()
        elif su == '0':
            break
    return len(stack)


if __name__ == '__main__':
    input = input()
    print(solution(input))

服务部署

动态规划,每一个值在符合要求的情况下只有两种可能,要么跳过它,要么包含它,所以要把其它不符合要求的情况列举完全。

#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
Welcome to vivo !
'''


def solution(total_disk, total_memory, app_list):
    # TODO Write your code here
    if total_disk <= 0 or total_memory <= 0:
        return 0
    if not app_list:
        return 0
    disk, memory, user = app_list[0]
    # print(disk, memory, user, type(user))
    if total_disk < disk or total_memory < memory:
        return 0
    else:
        # print(total_disk-disk, total_memory-memory, app_list[1:])
        return max(user+solution(total_disk-disk, total_memory-memory, app_list[1:]),
                   solution(total_disk, total_memory, app_list[1:]))


if __name__ == "__main__":
    input1 = input()
    disk = int(input1.split()[0])
    memory = int(input1.split()[1])
    input2 = input1.split()[2]
    app_list = [[int(j) for j in i.split(',')] for i in input2.split('#')]
    print(solution(disk, memory, app_list))

消消乐

思路采用重复覆盖的方法,始终在可能集中寻找索引递增的键值,弹出这个键值则依次将这个键值对应的索引加到其它值所对应的键值,但是要注意是在它们的取值范围内。这里没考虑嵌套的情况,是如何取舍?比如:3 1 2 2 4 2 4 5,到最后可能集中的值为{32: [2, 3, 5], 24: [4, 6]}

#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
Welcome to vivo !
'''


def solution(boxes):
    # TODO Write your code here
    values = set(boxes)
    possible = dict()
    for vu in values:
        count = boxes.count(vu)
        current = []
        for bi in range(len(boxes)):
            if boxes[bi] == vu:
                current.append(bi)
        possible[count*10+vu] = current

    res = 0
    visited = find(possible)
    while visited:
        cur = visited.pop()
        res += (cur//10) * (cur//10)

        possible = add(possible, cur)
        visited = find(possible)
    return res


def find(values):
    # print('find', values)
    res = []
    for vk, vu in values.items():
        if judge(vu):
            res.append(vk)
    return res


def judge(seq):
    if len(seq) < 2:
        return True
    pre = seq[0]
    for su in seq[1:]:
        if pre + 1 == su:
            pre = su
        else:
            return False
    return True


def add(values, key):
    value = values[key]
    values.pop(key)
    for vk, vu in values.items():
        if len(vu) < 2:
            continue
        vl, vr = vu[0], vu[-1]
        for val in value:
            if val >= vl and val <= vr:
                vu.append(val)
        tmp = list(set(vu))
        tmp.sort()
        values[vk] = tmp
    # print('add', value, values)
    return values


if __name__ == '__main__':
    x = input()
    boxes = list(map(int, x.split()))
    print(solution(boxes))

(最近更新:2019年09月14日)

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值