【思维】背包的占用与变大
题干
思路
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")
思考
属于排序模块写到这题,我的很多思路都局限在“对一个队列进行一定的规律排序与操作求解”,因此在过程中,我过多的考虑了如何在一个队列里排序并找到那个适合的值。
同时,我非常在意每一次放入后,包一定要是最大的。而参考思路在前部分的思路,是只要能放进去就好了,全部变大的放完后包就是阶段最大的了。
这个思路非常值得记录
同时,下一次思维题的时候,可以尝试换一种思路。打破认知局限很重要,但是我不是很懂如何去打破,可以再体验中摸索一下。