蓝桥杯真题训练
1-k倍区间
给定一个长度为 N的数列,如果其中一段连续的子序列之和是 K 倍数,我们就称这个区间 [i, j] 是 K 倍区间。
你能求出数列中总共有多少个 KK倍区间吗?
N,K=[int(x) for x in input().split()]
A=[0]*(N+1)
mod=[0]*K
n=0
for i in range(1,N+1):
A[i]=(int(input())+A[i-1])
mod[A[i]%K]+=1
n+=mod[A[i]%K]-1
if A[i]%K==0:
n+=1
print(n)
解题思路:利用每个区间的和取模相等的,即这个区间减去前一个相等模的区间,又是k的倍数区间,加上本身就是k的倍数的区间个数。参考文章:https://blog.csdn.net/qq_34594236/article/details/70845223?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164691855916780255226325%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164691855916780255226325&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-70845223.pc_search_result_cache&utm_term=%E8%93%9D%E6%A1%A5%E6%9D%AFk%E5%80%8D%E5%8C%BA%E9%97%B4&spm=1018.2226.3001.4187
2-鲁卡斯队列
如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 …1/3,3/4,4/7,7/11,11/18…会发现它越来越接近于黄金分割数!
你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与 0.6180340 一致的精度。
a = 1
b = 3
while round(a/b,6) != 0.618034:
t = a + b
a = b
b = t
c = str(a) + "/" + str(b)
print(c)
解题思路:利用内置函数round(),控制小数点后几位,与0.618034相比。
3-答疑
有 nn 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。
老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下:
首先进入办公室,编号为 ii 的同学需要 时间。
然后同学问问题老师解答,编号为 i的同学需要
答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可 以忽略。
最后同学收拾东西离开办公室,需要 时间 取值为 10000,20000或 30000一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。
答疑从 0 时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群 里面发消息的时刻之和最小。
n = int(input())
t = [[] for i in range(n)]
for i in range(n):
a,b,c=map(int,input().split(" "))
t1 = a + b + c
t2 = a + b
t[i].append(t1)
t[i].append(t2)
t.sort()
c1 = 0
c2 = 0
for i in range(n):
c1 = c1 + t[i][1]
c2 = c2 + c1
c1 = c1 - t[i][1] + t[i][0]
print(c2)
解题思路:利用总时间越小越好,总时间相等,则离收拾离开前的时间越小越好,python内置的sort()刚好满足这个要求。