题意:
有一个国王的左右手上分别写了a0,b0,他把他的n个臣子叫过来,左右手分分别写上ai,bi,每个臣子能获得的奖励是所有站在他前面的人a[i]的乘积除以这个臣子右手上的数字(国王始终站在第一个),国王想让臣子获得金币的最大值最小,问你国王该怎么安排这个队列?输出这个最小值。
思路:
假设有两个臣子一个国王,两个臣子分别为a1,b1,a2,b2,我们有两种排列方式,ans1=max(a0/b1, a0 * a1 / b2),ans2=max(a0/b2. a0 * a2 / b1), 我们简化一下,ans1=max(k1,k2),ans2=max(k3,k4),显然k1<k4,k2>k3。假设这时候满足ans1<ans2,即最大值应该在k3,k4中取,因为k2>k3,所以一定有k4>k2,带入式子,得a1b1<a2b2,所以我们只需要把n个人的ai*bi从小到大排序即可计算答案。
Python知识:
1、strip()方法
strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
2.sort是list类的一个方法,只能与list一起使用。它不是一个内置的迭代器。
L.sort(cmp=None, key=None, reverse=False)
cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
3.lambda函数作为参数传递给其他函数。
如:sorted与sort函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。
AC代码:
n = int(input())
#去掉字符串后面的空格,并将字符以空格分割
a,b = input().strip().split()
#将字符转化为数字
a,b = int(a),int(b)
#创建一个空列表
arr = list()
for i in range(0,n):
#c为两个数字字符组成的列表
c = input().strip().split()
for j in range (0,len(c)):
c[j] = int(c[j]) #转化为数字形式
arr.append(c) #向列表中加入该列表,因此arr相当于一个二维数组
arr.sort(key = lambda x:x[0]*x[1])
tot =a
res = tot //arr[0][1] //先记录下如果只有一个人的情况
tot *= arr[0][0]
for i in range (1,len(arr)):
res = max(res,tot//arr[i][1]) //找最大的,因为不一定是最后一个大
tot *= arr[i][0]
print(res)