题目描述

孙悟空给花果山的小猴子们分桃子。

首先,他让每只小猴在左、右手上面分别写下一个整数,悟空自己也在左、右手上各写一个整数。

然后,让这 n 只小猴排成一排,悟空站在队伍的最前面。

排好队后,所有的小猴都会获得一些桃子,每只小猴获得的桃子数分别是:排在该小猴前面的所有猴子的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

悟空不希望某一只小猴获得特别多的桃子,所以他想请你帮他重新安排一下队伍的顺序, 使得获得桃子最多的小猴,所获桃子尽可能的少。注意,悟空的位置始终在队伍的最前面。

输入

第一行包含一个整数 n,表示小猴数。

第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示悟空左手和右手上的整数。

接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个小猴左手和右手上的整数。

输出

包含一个整数,表示重新排列后的队伍中获桃子最多的小猴所获得的桃子数。

输入样例

3
1 1
2 3
7 4
4 6

输出样例

2

SOURCE

NOIP 2012 国王游戏

解决思路:

这是一道典型的使用贪心算法来解决的问题

我们知道,对于任意给定的队伍顺序:若是仅交换相邻的两只猴子的话,对于前面的猴子没有影响(不改变前面的分布),对于后面的猴子也没有影响(不改变左手的乘积)。因此,也就是说,我们通过讨论两只相邻猴子的是否交换,最后推出整只队伍的顺序,这就是最基础的思路。

数学证明:

设a1,b1为左手数字; a2,b2为右手数字

设七元组(P,a1,b1,a2,b2,sum,ans),(a1,b1)∈P,(a2,b2)∈P,sum是猴子1和猴子2前所有人左手上数字的乘积,ans是猴子1与猴子2所发钱财的最大值。
        若选择猴子1在前面,则ans=max(sum/b1,sum*a1/b2);
        若选择猴子2在前面,则ans=max(sum/b2,sum*a2/b1).
        
        易知,sum/b1<sum*a2/b1,且sum/b2<sum*a1/b2。
        ∴最优解选择猴子1在前面,当sum*a1/b2<sum*a2/b1,即a1*b1<a2*b2.
          最优解选择猴子2在前面,当sum*a2/b1<sum*a1/b2,即a2*b2<a1*b1

即得到结论:若要想使得到的ans最小,则尽量将左右手乘积小的放前面即可。

上面是对于两只相邻猴子的讨论,但实际上已经是对整个队伍的讨论。如果考虑按左右手乘积从小到大排列的排序,对任意一个无序排列,可经过有限次相邻的上述排列方法达到该排序,且有上述证明知每一次变换使结果更优(或至少不会更差),则可知按顺序由小到大时最优,及最大值最小!

代码实现:

num=int(input())+1
zong=[[0 for i in range(3)] for j in range (num-1)]
zuo,you=map(int,input().split())
cheng=zuo
for i in range (num-1):zong[i][0],zong[i][1]=map(int,input().split())zong[i][2]=zong[i][0]*zong[i][1]
xiao=1
for i in range (num-1):zong.sort(key=lambda x:x[2])
for i in range (num-1):if xiao<int(cheng/zong[i][1]):xiao=int(cheng/zong[i][1])cheng*=zong[i][0]
print(xiao)

贪心算法——国王游戏相关推荐

  1. 【贪心】国王游戏(ybtoj 贪心-1-4)

    国王游戏 ybtoj 贪心-1-4 题目大意 有一个国王和n个大臣 每人左右手分别有一个数,现在然你对大臣们排列(国王在第一个) 每个大臣所得金币是前面的人左手上的数的积除以他右手上的数 现在问你获得 ...

  2. 贪心算法-跳跃游戏——b

    1.题目描述 定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 2.问题分析 这也是一道跳跃问 ...

  3. 国王游戏(贪心算法+高精度运算)

    恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍的最前面. ...

  4. 【题解】P1080 国王游戏(贪心+高精python天下第一)

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

  5. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  6. # 国王游戏(贪心+大数乘除+微扰法证明)

    国王游戏(贪心+大数乘除+微扰法证明) 题意:n个大臣和一个国王,左右手都有一个数,排队,国王始终拍在最前面,每个大臣的奖励为这个大臣前面的人的左手上的数之积除以这个大臣右手上的数.构造最优队伍,使得 ...

  7. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

  8. 贪心算法很简单:跳跃游戏

    题目描述: 定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...

  9. 洛谷P1080 国王游戏(贪心)

    国王游戏 题目描述 恰逢 HHH 国国庆,国王邀请 nnn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nnn 位大臣排成 ...

最新文章

  1. HTML与XML总结
  2. lua学习笔记之位及字节
  3. Time Series Analysis
  4. idea中配置Springboot热部署
  5. ethtool 命令输出的注意点--网卡参数
  6. [置顶] Oracle学习经验谈
  7. DaisyDisk for Mac(磁盘清理软件)
  8. VMware 虚拟机安装系统
  9. mysql函数返回结果集_MySQL自定义函数
  10. c语言代码自动整理,C语言代码自动整理工具
  11. PLC(可编程逻辑控制器)
  12. 会话、Cookie、Session、url重写
  13. python系统运维工程师_系统运维工程师的工作职责
  14. 元宇宙系列之AI虚拟人:“人”潮汹涌 探路未来
  15. [收藏|转贴]货币金额大写转换库(C#)
  16. Fresco+Recycleview+OKhttp+Retrofit
  17. MySQL 的read_only super_read_only
  18. 浏览器内核学习笔记二
  19. 深入探索 Qt WebEngineCore:从基础原理到高级应用与技巧
  20. java 获取当前时间的前一天,前一周,前一月,前一年的时间

热门文章

  1. 明解C语言入门篇练习题第十三章
  2. 2020-06-08
  3. 何谓-全无线UWB定位系统
  4. 如何删除.git目录
  5. SAP 设置周期性的后台程序,SM36,图解操作 (转)
  6. 浙江省高等学校教师教育理论培训上机考试
  7. python在日常的一些用处
  8. JAVA file列出所有文件_用Java代码列出一个目录下所有的文件
  9. 正方形里面两个扇形相交部分_边长为1的正方形内,两个扇形,一个半圆,求阴影面积....
  10. LabelMe标记后的json文件怎么转为COCO格式