题目描述
代码
import math
n=int(input())
L=set(list(map(int,input().split())))
L=list(L)
L.sort()
bis=[]
for i in range(len(L)-1):
bis.append([i+1,i,L[i+1]/L[i]])
i1,i2=min(bis,key=lambda x:x[2])[0],min(bis,key=lambda x:x[2])[1]
#排序后,下标为i1的数肯定比i2大,不用去节外生枝判断
print(str(L[i1]//math.gcd(L[i1],L[i2]))+'/'+str(L[i2]//math.gcd(L[i1],L[i2])))
核心思想以及详解
本题核心思想是运用贪心的思想
详解如下:
n=int(input())
L=set(list(map(int,input().split())))
L=list(L)
L.sort()
以上代码时输入,set()函数的作用是创建一个集合,目的是为了去重,sort()函数的作用是让列表里面的元素从小到大排序。
for i in range(len(L)-1):
bis.append([i+1,i,L[i+1]/L[i]])
print(bis)
这一行代码的运行结果是
i1,i2=min(bis,key=lambda x:x[2])[0],min(bis,key=lambda x:x[2])[1]
这行代码的结果是i1=1,i2=0,是不是很不可思议!
这里会有一个误区,有关lambda函数,我们理解到的一般是说它是匿名函数eg:
a=lambda x:x+2
print(a(2))
输出结果为4
这里并不是这个意思,而是 很多时候需要对二维列表的第一个元素或者是第二个元素按照升序或者降序的规则排序,python提供了lambda表达式方便我们自定义排序的规则。x表示的是变量,也可以写成另外的变量,冒号后面跟着排序的参数,当一个参数的时候表示先对当前的参数进行排序
看代码为大家说明吧
最后一行代码,math.gcd()表示求公约数。想要更好的理解代码思想,我的意见是:多带几个例子,极致模仿,然后反复刻意练习。