解题思路:
我们知道等比数列的递推公式为an=a1*qn-1。ai/aj=qi-j。
此处我们就假设最大公比为q,采访的金额数组为A,假设A中有三个不相同的金额,经排序后A中相邻两个数的比值放入数组B中。
①一开始我想的是先将A去重,然后将A中的元素从大到小排序,最后输出最小的那一个。结果不正确。这个时候好像是只有22分。
分析原因:
通过刚刚的思路,在B中我们可以得到两个元素[qi,qj],此时i和j为>=1的正整数。如果此时B中最小的数为qi,如果i>1,那么我们将其输出后结果就是错误的。
②接着对算法进行改进,我们将B中的元素从大到小排序,然后将B中的相邻两个元素的比值添加到B中,最后输出B中最小的那个数。结果也是错误的,此时有78分。
分析原因:
经过改进的算法后我们知道,此时的B中有三个元素[qi,qj,qi-j],此时在①的基础上我们在B中又刷新出了一波较小值,那就是qi-j,最后为什么只得了78分呢,原因和之前是一样的,假设此时的最小值为qi-j,(i-j>=1),如果此时的i-j大于1那么我们输出的结果还是错误的。
③在②的基础上我们再次对算法进行改进,我们求②的刷新后的数组B中的最大公因数。此时AC了。
分析原因:
如果题目中没有说一定有解的话,其实最大公因数也不一定就是q。但是题目中说了一定有解,所以给出的数据就一定能得到q。
那么这里我们可能会有疑问,能不能在①的基础上我们直接求B中的最大公因数。这个我尝试过了,答案是错误的。
为什么在①的基础上求最大公因数不行,但是在②的基础上求就可以了呢,我认为可能是在①中的基础上B中的数据较少,不足以每次都能准确的得到q。
以上就是我对本题的一些想法,希望能够帮到大家。
注意事项:
参考代码:
from math import gcd def f(): A = {int(i) for i in input().strip().split()} A = list(A) A.sort(reverse=True) B = set() for i in range(len(A)-1): #A经过排序后相邻两个数之间的比值 x = gcd(A[i],A[i+1]) B.add((A[i]//x,A[i+1]//x)) B = list(B) B.sort(key= lambda x:x[0]/x[1],reverse=True) n = len(B) for i in range(n-1): #将B经过排序后相邻两个数的比值添加到B中 y = B[i][0]*B[i+1][1] x = B[i][1]*B[i+1][0] temp = gcd(x,y) B.append((y//temp,x//temp)) ymax = B[0][0] xmax = B[0][1] for i in range(1,len(B)): #求出B中的最大公因数 ymax = gcd(ymax,B[i][0]) xmax = gcd(xmax,B[i][1]) print('{}/{}'.format(ymax,xmax)) if __name__ == '__main__': num = int(input().strip()) f()
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复