【思维】背包的占用与变大

题干

alt

思路

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")

思考

属于排序模块写到这题,我的很多思路都局限在“对一个队列进行一定的规律排序与操作求解”,因此在过程中,我过多的考虑了如何在一个队列里排序并找到那个适合的值。

同时,我非常在意每一次放入后,包一定要是最大的。而参考思路在前部分的思路,是只要能放进去就好了,全部变大的放完后包就是阶段最大的了。

这个思路非常值得记录

同时,下一次思维题的时候,可以尝试换一种思路。打破认知局限很重要,但是我不是很懂如何去打破,可以再体验中摸索一下。

全部评论

相关推荐

点赞 评论 收藏
分享
三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务