第一题自己模拟一遍,然后直接 print 结果
模拟的代码:
ls = list(range(1, 101))
while len(ls) > 9:
ls.append(ls.pop(0) + ls.pop(0))
print(ls)
提交的代码:
print([484, 548, 612, 676, 740, 430, 264, 520, 776])
第二题也是一样
right = 200
for left in range(198, 0, -2):
right = left - right if left >= right else left + right
print(right)
提交的代码:
print(10100)
不过这题稍微想一下 198 ▲ 200 = 198 + 200
然后左边永远小于右边,所以就是求和就得了
print(sum(range(2, 201, 2)))
当然我写上面那三行比动脑子要省时间的多。。。所以我选择不动脑子
第三题不知道是什么破玩意,模拟题也没有这么出的,鄙视他。
第四题先排序,不用每操作一下就改一下数组内容,每次 max 再 index 多慢啊,
一个O(nlogn)的算法生生被你写成O(n2)的
输入忽略
ls.sort(reverse=True)
s = 0
for i, v in enumerate(ls):
s += v
if s >= h:
print(i + 1)
return
print('No')
第五题,这题用得着递归吗
he = ping = gai = m // 3
while ping >= 2 or gai >= 5:
he += ping // 2 # 2空瓶换1瓶盖,喝了
gai += ping // 2
ping = ping // 2 + ping % 2 # 剩的空瓶 + 新喝出来的空瓶
he += gai // 5
ping += gai // 5
gai = gai // 5 + gai % 5 # 盖同理
print(he)
不考虑什么找商店借一瓶饮料之类的脑筋急转弯问题
第六题,你都知道用数组了,不知道用下标吗。
而且这题描述是什么鬼。。。
入口门选的就是1,那不是一个门都不打开就能看到1吗
你非要不看的话,那打开1看到3,打开3看到5,打开5看到1,3次没错
入口门2,打开2看到4,打开4看到1,打开了2次
入口门3,打开3看到5,打开5看到1,打开了2次
入口门4,打开4,看到1
入口门5,打开5,看到1
print([0,2,2,1,1][n - 1])
第七题,题目也没说非要合并,如果不合并的话,那就是min(ls),
不过觉得这不是题目想要的
如果非要合并的话,枚举可以,但稍微用点技巧(前缀和)可以写成O(n2),
你写的O(n3),而且吧。。len(ls[i:j]) 这是怎么想的。。。这难道不等于 j - i 吗
而且取最小值这次你咋想起来排序了,你前面max函数不是用的好好的?min不知道?
s = [0]
for i in ls:
s.append(s[-1] + i)
m = float('INF')
for i in range(len(ls)):
for j in range(i + 2, len(ls) + 1):
m = min(m, (s[j] - s[i]) / (j - i))
print(round(m, 1))
第八题,10个数而已,枚举即可,但是题目描述又不清不楚的,“得到油”是让油溢出来,
而水不溢出来吗?
maxo = 0
maxf = 0
t = [18, 11, 22, 17, 12, 29, 28, 26, 20, 21]
for i in range(1024):
s = 0
for j in range(10):
if i & (1 << j) > 0:
s += t[j]
if s > 60:
continue
o = s + 24 - 60
if o > maxo:
maxo = o
maxf = 1
elif o == maxo:
maxf += 1
print(maxo, maxf)
第九题,枚举前三位,只要前三位和 < 10,就能构造这样的 >= 4 位数,
至于这数是什么,不重要
s = 0
for i in range(1, 10):
for j in range(10):
for k in range(10):
if i + j + k < 10:
s += 1
print(s)
当然要求“第四位以后的每个位数都是前面相邻三位的和”也可以,稍作修改即可
第十题,枚举开门那 12 小时,为了偷懒,直接开 24 的数组。
s = [0] * 24
for start, end in timelist:
for h in range(start, end):
s[h] += 1
mx = max(s[12:24])
mn = min(s[12:24])
if mn < m:
print('no\n{}'.format(mn))
else:
print('yes\n{}'.format(mx))
第十一题,懒得想了,直接枚举
m = 0
for i in range(361):
for j in range(361):
m = max(m, min(i // 30 + j // x, (360 - i) // 10 + (360 - j) // y))
print(m)
总的来说,题都挺无聊的
【 在 loverain (八级大狂风吹) 的大作中提到: 】
: 考试不能用外部模块,比如numpy
: 本青自学编程后第一次参加这种笔试,是题难还是水平太菜,各位大佬两小时能编的完吗,
: 第3题没写完,想先做后面的,
: ...................
--
FROM 221.217.55.*