零、前言
上一次参加的时候还是十几期,转眼来到了五十多期。
不太熟悉输入输出,所以在输入输出花了大半时间研究。
(十分钟写四个题的大佬,这应该是写过一遍又一遍原题了)
一、第一题
小明投篮,罚球线投球可得一分,在三分线内投篮得分可以得到2分,在三分线以外的地方投篮得分可以得到3分,连续投进得分累计,一旦有一个球没投进则得分清零,重新计算。现给出所有得分记录(清零不计入得分),请你计算一下小明最多连续投进多少个球?
这里需要想清楚几个点:
- 给出的得分记录都是大于0,说明至少进1个球,可以把进球初始值设为1。
- 递增默认视为连续进球。
所以,其实是找递增序列的最大长度,不过要注意其最小长度为1(可能有[3,3,3],或者[3,2,1]这种情况)。
def solution(self, n, arr):
result = []
jinqiu = 1
for i in range(1,n):
if arr[i]>arr[i-1]:
jinqiu += 1
result.append(jinqiu)
if arr[i]<=arr[i-1]:
jinqiu = 1
return max(result)
二、第二题
小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。
可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。
思路:
- 粗看是一个整数问题:
6x+8y=n
min{x+y}
- 仔细一想,多用8个每袋的包装就能使其尽量少,所以尽量用8个每袋的包装。
- 6和8最小公倍数为24,所以当n≥24时,每24个苹果都可以用3袋8个每袋的包装解决,使之降到24以内。所以关键就在于处理小于24.
- n很大的时候按照第2条是没问题的,但n不那么大的时候应该有6个每袋的参与。 6,12,18这几个n值都是能整除6而不能整除8,所以需要单独挑出来思考分配问题。
def solution(self, n):
result = -1
bag = 0
while(n>=0):
if(n == 0):
result = bag;
if(n>=8 and n!=18 and n!=12): #6、8最小公倍数为24,小于24的6的倍数为12,18
n-=8
bag+=1
else:
n-=6
bag+=1
return result
三、第三题
一个小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
思路:
1间房屋,取该值
2间房屋,取最大值
3间房屋,max{2,1+3}
4间房屋,max{1+3,2+4}
5间房屋,max{1+3+5,1+4,2+4}
……
粗看开始以为是个排列组合,然后求最大值的数学问题。
仔细想,关键在于判断的区间是怎么样,并非把所有值求出来再取最大值这种“暴力”问题。
不妨设偷前k个房屋最高金额
y= f(k)
分为两种情况:
- 偷第k个,则第k-1个不能偷,则需要判断第k-2个是否要偷,实质上是偷前k-2个房屋最高金额y=f(k-2)+第k间房屋的钱。
- 不偷第k个,则需要判断第k-1个是否要偷,实质上是偷前k-1个房屋最高金额y=f(k-1)。
所以
f(k)=max{f(k-1),f(k-2)+第k间房屋的钱}
def solution(self, n, arr):
result = None
tou = [0]
tou.append(arr[0])
for i in range(2,n+1):
tou.append(max(tou[i-1],tou[i-2]+arr[i-1]))
return tou[n]
四、第四题
天然气运输成本昂贵,危险性高,为了节省运输成本,提倡绿色环保,需要尽可能的优化订单配送,比如相同地区的天然 气订单可以一次性配送。现需要向多个地区运输天然气。但是同一个地区可能有多个订单需求。当前仅只知道某些成对的订单是同一个地区的,同一个地区的天然气需要尽可能一次性配送从而降低运输成本,所以需要尽可能的将同一个地区的订单放在一起。订单的编号是1到n。
思路:
- 考察的知识点:图的遍历以及连通块的查找。
- 总之,优化天然气订单的配送需要确定哪些订单属于同一个地区,并将它们放在一起,以最大程度地减少运输成本和提高配送效率。
这里由于脑袋短路,突然间不太懂输出,索性按照老办法用print来解决。
def solution(self, n, m, vector):
result = []
nodes = list(range(n+1))
def find(n):
if nodes[n] == n:
return n
nodes[n] = find(nodes[n])
return nodes[n]
for i in range(m):
a = find(vector[i][0])
b = find(vector[i][1])
if a<b :
nodes[b] = a
else:
nodes[a] = b
res = dict()
for i in range(1,n+1):
if nodes[i] == i:
res[i] = [i]
else:
res[find(nodes[i])].append(i)
print(len(res))
for value in res.values():
print(*value)
return result