国王游戏

  • 题目描述
  • 输入描述
  • 输出描述
  • 输入输出样例
    • 示例输入
    • 示例输出
  • 解题思路
    • 从推测开始
    • 尝试优化排序方法
    • 整理思路
  • 代码实现

题目描述

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

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

输入描述

第一行包含一个整数 n,表示大臣的人数。

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

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

其中,1≤n≤1000,0<a,b<1041≤n≤1000,0<a,b<1041 \leq n \leq 1000,0 < a,b < 10^41≤n≤1000,0<a,b<10 41≤n≤1000,0<a,b<1041≤n≤1000,0<a,b<104 。

输出描述

输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

输入输出样例

示例输入

3
1 1
2 3
7 4
4 6

示例输出

2

解题思路

在解题之前,先把题目读懂:

队伍的最开头是国王,且其位置不能变,每位大臣获得的金币数是排在该大臣前面的所有人(包括国王)的左手上的数的乘积除以该大臣自己右手上的数,然后向下取整得到的结果。

从这里可以看出,国王右手的数字其实是无关紧要的。

题目要求使得获得奖赏最多的大臣,所获奖赏尽可能的少,给的方法是给队伍重新排序。

找到获得奖赏最多的大臣并不难,只需要遍历一遍即可知道答案,但是怎么排序才能让其所获奖赏尽可能的少是需要解决的问题,因此问题的关键在于排序。

从推测开始

关于排序,我一开始做了一个小小的推测,因为是累乘,所以最后累乘左手的数应该最大,而右手的数也最大,所以最后得的金币也不会很多,因此将队伍从小到大进行排序(先排左手,在排右手),让左手和右手数字大的大臣尽可能往后排,这样能让后面的大臣所获奖赏最大,但又尽可能地少,这个方向是对的,但是不完美。

但是,不完美的地方在于左手数值小,但是右手数值非常大的情况,下面举个例子。

假设输入为:

6
1 1
2 2
3 5
2 1
3 1
2 9
1 2

排序后的结果为:

1 1
1 2
2 1
2 2
2 9
3 1
3 5

我们依次计算一下每个大臣可以得到的金币:

  • 大臣1:1 / 2 = 0
  • 大臣2:1 * 1 / 1 = 1
  • 大臣3:1 * 1 * 2 / 2 = 1
  • 大臣4:1 * 1 * 2 * 2 / 9 = 0
  • 大臣5:1 * 1 * 2 * 2 * 2 / 1 = 8
  • 大臣6:1 * 1 * 2 * 2 * 2 * 3 / 5 = 4

这时可以明显看到大臣4的金币要比大臣2或大臣3的金币要少,且大臣5比大臣6的金币多,这不是我们期望的结果,我们期望的结果是队伍后面的大臣拿到的金币最多,但是金币又尽可能地少。

那么怎么优化呢?

尝试优化排序方法

我们不妨做一下对比,观察大臣4和大臣5的左右手:

  • 大臣4:(2, 9)
  • 大臣5:(3, 1)

大臣5比大臣4的金币多是因为大臣5的右手数值非常小,或者说大臣4的右手数值非常大,这样一来,就出现了bug

因此,我们不能先按左手数值的大小排完后再按右手的数值排序。

将大臣4与大臣5交换:

1 1
1 2
2 1
2 2
3 1
2 9
3 5

再来计算一下每个大臣可以得到的金币:

  • 大臣1:1 / 2 = 0
  • 大臣2:1 * 1 / 1 = 1
  • 大臣3:1 * 1 * 2 / 2 = 1
  • 大臣4:1 * 1 * 2 * 2 / 1 = 4
  • 大臣5:1 * 1 * 2 * 2 * 3 / 9 = 1
  • 大臣6:1 * 1 * 2 * 2 * 3 * 2 / 5 = 4

很明显,大臣5得到的金币变少了,与此同时,大臣4的金币增加了。
(这里的大臣n指队伍的第n个大臣,第一个国王不算在内)

这时我们再来看看大臣3和大臣4:

  • 大臣3:(2, 2)
  • 大臣4:(3, 1)

将两位大臣交换:

1 1
1 2
2 1
3 1
2 2
2 9
3 5

计算每个大臣可以得到的金币:

  • 大臣1:1 / 2 = 0
  • 大臣2:1 * 1 / 1 = 1
  • 大臣3:1 * 1 * 2 / 1 = 2
  • 大臣4:1 * 1 * 2 * 3 / 2 = 3
  • 大臣5:1 * 1 * 2 * 3 * 2 / 9 = 1
  • 大臣6:1 * 1 * 2 * 3 * 2 * 2 / 5 = 4

很明显,经过交换,能使被交换的大臣得到的金币变少

整理思路

通过上面几次尝试,不难发现一个规律,那就是:

前一个大臣的左右手乘积比后一个大臣的左右手乘积大时,进行交换,此时能减少后者所得金币

将这一思路整理成代码:

sort(key=lambda x: x[0]*x[1])  # 按照左右手乘积 升序排列

代码实现

将上述思路整理成代码:

def KingGame():n = int(input())king = list(map(int,input().split()))[0]troops = []for item in range(n):troop = list(map(int,input().split()))troops.append(troop)# troops[1:] = sorted(troops[1:])troops.sort(key=lambda x: x[0]*x[1])  # 按照左右手乘积 升序排列print(troops)count = kingmaxResult = count // troops[0][1] # 计算第一个大臣可以得到的金币for item in range(1, n):count *= troops[item-1][0]result = count // troops[item][1]if result > maxResult:maxResult = resultprint(maxResult)KingGame()

蓝桥云题库之国王游戏——Python满分解答相关推荐

  1. 蓝桥云算法题之棋盘放麦子——Python满分解答

    棋盘放麦子 题目描述 运行限制 解题思路 代码实现 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服,问他要什么 ...

  2. 蓝桥云算法题之火柴棒等式——Python满分解答

    火柴棒等式 题目描述 图片描述 输入描述 输出描述 输入输出样例 示例 1 输入 输出 样例解释 示例 2 输入 输出 样例解释 解题思路 代码实现 题目描述 给你 n 根火柴棍,你可以拼出多少个形如 ...

  3. java云题库测试使用说明 0917

    java云题库测试使用说明 0917 题目数量 50题 考试时长 150分钟

  4. 软题库 - 软考题库,云题库,智能测试

    软题库 - 软考题库,云题库,智能测试 软题库 - 软考题库,云题库,智能测试 posted on 2017-04-17 16:43 lexus 阅读(...) 评论(...) 编辑 收藏 转载于:h ...

  5. 北大青鸟ACCP一期云题库难题总结

    总结了352道云题库的难题,来自北大青鸟通州校区a105班. 这里的题部分没有答案,可以去我主页免费下载word文档版的 带有完整答案的. 1.在Java中,运行下面的代码,输出结果是 hello. ...

  6. 软考刷题利器—软考云题库Web版

    之前有朋友说小程序刷题有时不太方便,想在电脑上刷题,能不能开发个Web版,后来就有了软考云题库的Web版. 项目采用了SpringBoot 2.0+JPA+Thymeleaf 模板+Bootstrap ...

  7. 软考云题库Web版题库V1.1更新功能

    这一周软考云题库Web版迎来了一次重要的迭代更新,已于2020/1/5 日更新发布了,试用的同学可以前往试用体验新功能了.如果您有好的建议和意见也欢迎留言交流. 本次更新内容 首页调整,增加考试倒计时 ...

  8. CCF 201512-2 消除类游戏 python 满分

    CCF 201512-2 消除类游戏 python 满分 题目叙述 问题描述:略 输入格式:略 输出格式:略 样例 满分证明 解题思路 满分代码 优化代码 题目叙述 问题描述:略 输入格式:略 输出格 ...

  9. 华为OD机试2023年最新题库(JAVA、Python、C++)

    我是一名软件开发培训机构老师,我的学生已经有上百人通过了华为OD机试,学生们每次考完试,会把题目拿出来一起交流分享. 2023年5月份题库已经更新为OD统一考试(B卷),题库由三部分组成: 1.202 ...

最新文章

  1. winform程序打包EXE三种方式
  2. 海口这家只收5元的理发店火了 顾客求涨价老板都不肯
  3. 如何编写简单的lua小脚本@@
  4. OpenCV曼德布罗特平行线Mandelbrot Parallel的实例(附完整代码)
  5. IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
  6. 【Leetcode | 9】217. 存在重复元素
  7. LeetCode 第 22 场双周赛(220/2041,前10.8%)
  8. Properties的使用
  9. jquery jstree 插件的使用
  10. 微软一些工具的官方下载地址
  11. [Codeforces 100633J]Ceizenpok’s formula
  12. as工程放到源码编译_「Do.016」AndroidStudio不用编译,阅读Android源码
  13. FR按钮调用数据库(MMSQL)存储过程,参数储存有返回值; 模板参数不可见 编辑后可见
  14. 编写VTK文件,导入paraview显示
  15. 对Kindle进行可用性研究
  16. MySQL -update语句流程总结
  17. word2016 页码问题
  18. 区块链是什么意思?源中瑞开发BaaS平台促进企业数字转型升级
  19. 计算机二级操作题相关笔记
  20. 卫健委:2020年基本建立较完善的三级公立医院绩效考核体系

热门文章

  1. 苹果9月12日发布新品,新款iPhone谍照曝光;滴滴多次拒绝调查取证;软银放弃认购蔚来汽车2亿美元IPO股票 | 雷锋早报...
  2. Linux7浏览器打不开网页,centos7浏览器打不开网页
  3. 经典名句_万金油_新浪博客
  4. 小型RTK/LITE RTK/Mini RTK CR202(9P+4G+imu) 惯导 实现高精度厘米级定位,输出组合导航位置,定位数据回传服务器
  5. 【C语言】如何理解【void(*)(void)】
  6. matlab代码折叠与分节注释
  7. Matlab模拟质点极坐标系中运动规律(螺旋运动)
  8. [SSH服务]——一些安全性配置和补充实验
  9. @Slf4j注解实现日志输出
  10. windows编程中wParam和lParam消息