仅供学习交流用,侵删。 只关注编程题的同学,请点击目录直接跳转。
目录
单选题节选
有多选和单选,有点恶心的。。不确定答案,仅截图记录了。
编程题1
第一题解答:
a = []
n = int(input())
m = int(input())
for i in range(n):
a.append(int(input()))
kmin = max(a)
for i in range(m):
a[a.index(min(a))] += 1
print(max(a), kmin + m)
编程题2
先手写了几个情况,从6、7、8、9写了4个,发现推导过程中,蕴含着一个迭代的过程,所以考虑找规律。最终归纳为一个等比数列求和的问题:
n = int(input())
if n>=6:
print( 2**(n-6)%666666666 )
else:
print(0)
然后神奇地发现case100%,通过了。。。
编程题3
此题原型为Codeforces 558C Amr and Chemistry,可网上搜索相关答案。
下面给出2种解答:
第一种case通过率80%:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 11 13:49:13 2019
第三题
试剂x2或者/2,最少几次使得试剂量相等
@author: youxinlin
"""
'''
# input
3
4 8 2
# output
2
# input
3
3 5 6
# output
5
'''
read = lambda: map(int, input().split())
n = int(input())
a = list(read())
m = max(a) + 1 #最大剂量+5
cnt = [0] * m
print('ori cnt = ',cnt)
step = [0] * m
print('ori step = ',step)
was = [-1] * m #几种档位
print('ori was = ',was)
print(' ')
for i in range(n):
x = a[i]
q = [(x, 0)]
st = 0
while st < len(q):
x, y = q[st] #数值,步数
st += 1
if x >= m or was[x] == i:
#若翻倍后的剂量大于一开始时的【最大剂量】,或,没有更多选择了(即q中之后其他的备选方案中剂量已经是达到过的x了)
# 不让最终方案的剂量大于一开始最多剂量的那瓶,减少运算量。因为若选择往上翻倍,必然存在最小公倍数,则无止境。
continue
was[x] = i #was的索引表示剂量档位,第i瓶试剂达到了这个档位,则置该档位为该瓶标号i;
# 如果没有瓶子达到过某个档位 则该位一直是-1
# 所以 was数组记录着情况
print('was = ',was)
step[x] += y # 某瓶达到x档位所需要的步数。( 不用st,保证是最少的步数!)
print('step = ',step)
cnt[x] += 1 #计数。某瓶试剂量达到x档位后,这个档位被达到的次数+1。
print('cnt = ',cnt)
q.append((x * 2, y + 1)) #q存放方案,每次操作都可以乘以2或者除以2。x表示剂量,y表示第几次操作
q.append((x // 2, y + 1))
print('q =',q)
print('\n')
result = min(step[x] for x in range(m) if cnt[x] == n) #当 cnt[x]==n,表示x这个档位同时有n瓶达到过,即符合所有瓶子的剂量相等的条件
# 即可以让每瓶的剂量都 等于 x ,从而满足要求
# step[x] 记录着 让每瓶剂量都等于x所需要的最小操作次数
# 再从step[x]中选出最小值 即题目所求最小值
print(result)
这种方案优先选择往下降倍的方案的原因是:假设有两瓶试剂,一开始剂量为a,b。
往上翻倍达到二者剂量最小公倍数需要的操作次数是:
log2(b)+log2(a),if a,b互质
log2(b/a),if b能整除a,即b为最小公倍数
往下除以2达到二者剂量的最大公约数需要的操作次数是:
log2(a)+log2(b),if a,b互质
log2(b/a),if b能整除a,即a是最大公约数
故二者操作次数相等,只需考虑往下降倍的方案,使得穷举方案时可以收敛到剂量为0,在有限步骤内完成。
第二种方案是网上别人作答方案:
#第三题python3:(更快版本)
def main():
input()
aa = list(map(int, input().split()))
le, l = max(aa).bit_length(), []
for i, a in enumerate(aa):
j = le - a.bit_length()
aa[i] = a << j
l.append(j)
mi, ma = min(aa), max(aa)
a = mask = (1 << le) - 1
if mi == ma:
while mi == mi & a:
mask = a
a &= a << 1
else:
while mi != ma:
mask &= mask << 1
mi >>= 1
ma >>= 1
while not (mi & 1):
mask &= mask << 1
mi >>= 1
mask ^= (1 << le) - 1
le = mask.bit_length() + 1
res = [0] * le
cache = {}
for a, i in zip(aa, l):
a &= mask
if a:
a = a.bit_length()
tmp = cache.get((i, a))
if tmp is None:
cache[i, a] = tmp = [0] * le
if a:
base, baseidx = a - i, le - a - 1
else:
base, baseidx = 0, le - i - 1
i, j = baseidx, base
while i:
i -= 1
j += 1
tmp[i] = j
i, j = baseidx, base
while i < le:
tmp[i] = j
i += 1
j += 1
for i, j in enumerate(tmp):
res[i] += j
print(min(res))
if __name__ == '__main__':
main()
问答题(二选一)
选答了第二题。
正好最近看了一些稀少目标检测的文献:Schwartz E , Karlinsky L , Shtok J , et al. RepMet: Representative-based metric learning for classification and one-shot object detection[J]. 2018.
这篇文章里很详实地介绍了少量样本训练和分类识别问题的related work,通过阅读相关工作,可以大概了解一下现有的方法。另外,作者也基于DML提出了新的网络模型用于解决这个问题。
用DML来处理稀少样本问题是个不错的途径。推荐一本外文书:Metric Learning: A Survey。
看完大概也能讲出一些东西,这样开放题,言之有理即可吧。