2025年洛谷P1080 国王游戏(贪心)

洛谷P1080 国王游戏(贪心)国王游戏 题目描述 恰逢 H H H 国国庆 国王邀请 n n n 位大臣来玩一个有奖游戏 首先 他让每个大臣在左 右手上面分别写下一个整数 国王自己也在左 右手上各写一个整数 然后 让这

大家好,我是讯享网,很高兴认识大家。

国王游戏

题目描述

恰逢 H H H 国国庆,国王邀请 n n n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n n n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

我们先考虑两个相邻的位置 x x x y y y 情况,我们假设此时位置 x x x 位置前的所有人的左手连乘为 p p p 。若另 x x x 在前,那么此时 x x x y y y 的权值分别为 p b x \frac{p}{b_x} bxp , p × a x b y \frac{p×a_x}{b_y} byp×ax ,若另 y y y 在前,则权值分别有 p b y \frac{p}{b_y} byp , p × a y b x \frac{p×a_y}{b_x} bxp×ay

那么此时我们假设我们需要另第一种的摆放方式的最大值更小,则有:
m a x ( p b x , p × a x b y ) < m a x ( p b y , p × a y b x ) max(\frac{p}{b_x} , \frac{p×a_x}{b_y}) < max(\frac{p}{b_y} , \frac{p×a_y}{b_x}) max(bxp,byp×ax)<max(byp,bxp×ay)
因为这里本来就有 p × a x b y > p b y \frac{p×a_x}{b_y} >\frac{p}{b_y} byp×ax>byp,所以 m a x ( p b y , p × a y b x ) = p × a y b x max(\frac{p}{b_y} , \frac{p×a_y}{b_x})=\frac{p×a_y}{b_x} max(byp,bxp×ay)=bxp×ay ,所以就有:
m a x ( p b x , p × a x b y ) < p × a y b x max(\frac{p}{b_x} , \frac{p×a_x}{b_y}) < \frac{p×a_y}{b_x} max(bxp,byp×ax)<bxp×ay

这里又本来就有 p b x < p × a y b x \frac{p}{b_x}<\frac{p×a_y}{b_x} bxp<bxp×ay ,所有只要满足下列式子就满足条件:
p × a x b y < p × a y b x \frac{p×a_x}{b_y} < \frac{p×a_y}{b_x} byp×ax<bxp×ay

即: a x × b x < a y × b y a_x×b_x<a_y×b_y ax×bx<ay×by

所以可以得出,若要让 x x x 摆在前面最大值更小,就必须满足 a x × b x < a y × b y a_x×b_x<a_y×b_y ax×bx<ay×by ,同理我们也可以得到,若要让 y y y 摆在前面最大值更小,就必须满足 a y × b y < a x × b x a_y×b_y<a_x×b_x ay×by<ax×bx ,那我们也就可以推出,对于仅仅考虑单独的两个位置而言,要让最大值最小,就要另 a i × b i a_i×b_i ai×bi 更小的放前面,所以将 a i × b i a_i×b_i ai×bi 更小的放前面就会使得答案变得更优,且不会影响前面和后面的权值。所以对于整个序列而言,我们只要发现相邻 a i × b i a_i×b_i ai×bi 呈逆序的情况,我们就将其交换,这样可以使得两点间的最大值变得更小,且不影响全局的情况。那么我们不断这样操作,我们就可以将可以变小的地方全部变小了,且我们发现再进行任何操作都只会使答案变得更劣。那么最终操作的结果也就是全局不出现相邻 a i × b i a_i×b_i ai×bi 呈逆序的情况,也就是按照 a i × b i a_i×b_i ai×bi 排好了。所以我们就按 a i × b i a_i×b_i ai×bi 为关键字排好序,直接模拟计算即可。因为数据太大可能会爆,所以得用大数处理。

n = int(input()) t = input().split(' ') A, B = int(t[0]), int(t[1]) a = [] for i in range(0, n): t = input().split(' ') a.append((int(t[0]), int(t[1]))) a.sort(key = lambda x : x[0] * x[1]) mx = 0 for i in range(0, n): if A // a[i][1] > mx: mx = A // a[i][1] A *= a[i][0] print(mx) 
讯享网
小讯
上一篇 2025-02-20 09:25
下一篇 2025-01-19 17:10

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/15719.html