【思维】背包的占用与变大
题干
思路
1.原思路
我的思路非常地暴力,就是定义一个类,放置其bigger和size,然后对其先按bigger排序再按size排序。然后在这个里面找
每一次都要从头找,而且中间还用到了remove,所以感觉上也是时间复杂度太高了的
class Gift:
    s = 0
    b = 0
    x = 0
    def __init__(self, a, b, c):
        self.s = a
        self.b = b
        self.x = c
t = int(input())
for i in range(t):
    n, v = map(int, input().split())
    gifts = []
    for j in range(n):
        n1, n2 = map(int, input().split())
        gift = Gift(n1, n2, n2-n1)
        gifts.append(gift)
    ls = sorted(gifts, key = lambda item:(-item.x, item.s))
    i = 0
    while i < n:
        if v >= ls[i].s:
            v = v + ls[i].x
            ls.remove(ls[i])
            n = n - 1
            i = 0
        else:
            i = i + 1
    if n == 0:
        print("yes")
    else:
        print("no")
        
2.参考思路
采用了两个list,把包变大的放一块,包变小的放一块。先把能把包变大的,从小到大放进去,然后再放让包变小的
class Gift:
    s = 0
    x = 0
    def __init__(self, a, b):
        self.s = a
        self.x = b
t = int(input())
for i in range(t):
    n, v = map(int, input().split())
    a = []
    b = []
    for j in range(n):
        n1, n2 = map(int, input().split())
        gift = Gift(n1, n2-n1)
        if gift.x >= 0:
            a.append(gift)
        else:
            b.append(gift)
    lsa = sorted(a, key = lambda item:(item.s))
    lsb = sorted(b, key = lambda item:(-item.x))
    flag = True
    for i in lsa:
        if v < i.s:
            flag = False
            break
        else:
            v = v + i.x
    if flag == True:
        for i in lsb:
            if v < i.s:
                flag = False
            else:
                v = v + i.x
    if flag == True:
        print("yes")
    else:
        print("no")
思考
属于排序模块写到这题,我的很多思路都局限在“对一个队列进行一定的规律排序与操作求解”,因此在过程中,我过多的考虑了如何在一个队列里排序并找到那个适合的值。
同时,我非常在意每一次放入后,包一定要是最大的。而参考思路在前部分的思路,是只要能放进去就好了,全部变大的放完后包就是阶段最大的了。
这个思路非常值得记录
同时,下一次思维题的时候,可以尝试换一种思路。打破认知局限很重要,但是我不是很懂如何去打破,可以再体验中摸索一下。
 查看11道真题和解析
查看11道真题和解析 投递美团等公司10个岗位
投递美团等公司10个岗位 字节跳动公司福利 1311人发布
字节跳动公司福利 1311人发布