模拟笔试 - 卡码网周赛第四十六期(24年得物春季笔试真题)
206 开幕式排练
时间复杂度太高的代码:
思路是将给定的序列进行排序,首先升序取第一个,然后去第一个,降序取最后一个,然后去最后一个,以此类推,虽然是对的,但是时间复杂度太高了,未通过本题。
n = [2,1,1,3,2,1,2,3]
# a = int(input())
# n = list(map(int,input().split()))
n.sort()
result = [0] * len(n)
l = len(n)
count = 0
while count <= l:
if count % 2 == 0:
n.sort()
if len(n) == 1 :
result[count//2] = n[0]
break
elif len(n) == 0:
break
n = n[1:]
result[count//2] = n[0]
else:
n.sort(reverse=True)
result[l-(count+1)//2] = n[-1]
n = n[:len(n)-1]
count += 1
dif = 0
for i in range(1,len(result)):
dif = max(dif,abs(result[i]-result[i-1]))
print(dif)
额,上面代码好像也是错的。
下面的代码才是对的
n = int(input())
nums = list(map(int, input().split()))
nums.sort()
ans = []
ans.append(nums[-1])
j = 0
for i in range(n-2, -1, -1):
if j % 2 == 0:
ans.append(nums[i])
else:
ans.insert(0, nums[i]) # 在`ans`的第0个位置插入`nums[i]`
j += 1
maxx = 0
for i in range(n):
diff = abs(ans[i] - ans[(i+1)%n])
if diff > maxx:
maxx = diff
print(maxx)
这个代码虽然正确,但是思路其实和我的是差不多的,首先是对nums进行排序,然后从最后一个开始取,先放到ans里,然后取倒数第二个,放在ans的末尾,然后继续向前取,放在ans的开头,依次类推。
首先把最大的放进来,然后把第二大的放右边,第三大的放左边,第四大的放右边,第五大的放左边....
我的思路其实是对的,首先进行排序,排序一次放一个,时间复杂度很高,所以不如上面的思路。
先确定基准,然后左插入右插入才是正解。只需要排序一次即可。
207 最少数字
时间复杂度过高的代码:
n,m = map(int,input().split())
nums = list(map(int,input().split()))
dp = [float('inf')] * (m+1)
dp[0] = 0
for num in nums:
if num > m:
continue
for j in range(m,num-1,-1):
dp[j] = min(dp[j],dp[j-num]+1)
if dp[-1] == float('inf'):
print('No solution')
else:
print(dp[-1])
可以通过的代码:
def main():
import sys
input = sys.stdin.read
data = input().split()
n = int(data[0])
m = int(data[1])
nums = list(map(int, data[2:2+n]))
dp = [float('inf')] * (m+1)
dp[0] = 0
for num in nums:
if num > m:
continue
for j in range(m,num-1,-1):
# dp[j] = min(dp[j],dp[j-num]+1)
if dp[j - num] + 1 < dp[j]:
dp[j] = dp[j - num] + 1
if dp[-1] == float('inf'):
print('No solution')
else:
print(dp[-1])
if __name__ == "__main__":
main()
反思:
通过上面两个代码的对比,我们可以发现dp[j] = min(dp[j],dp[j-num]+1)写成
if dp[j] > dp[j - num] + 1 :
dp[j] = dp[j - num] + 1
的时间复杂度会更低,所以之后如果再遇到这种题目,直接写成上面这种(如果它大于它,那么它等于它)
其次,如果还是过不去的话,那就需要定义函数,然后用
if __name__ == "__main__":
main()
运行的话,时间复杂度会更低。
两个优化点。