P1080 国王游戏(贪心)

题意:
有一个国王的左右手上分别写了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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值