洛谷 P1080 国王游戏 (贪心)

目录

1.题目

2.定义结构体存数据

3.贪心排序规则

结论

4.乘积太大存不下:用高精度

[4.1 问题在哪](#4.1 问题在哪)

[4.2 我们要写两个高精度操作](#4.2 我们要写两个高精度操作)

[4.3 高精度存储规则](#4.3 高精度存储规则)

[4.4 高精度 大数 × 小整数 函数](#4.4 高精度 大数 × 小整数 函数)

[4.5 高精度 大数 ÷ 小整数 函数](#4.5 高精度 大数 ÷ 小整数 函数)

[5. 大数比较,找最大值](#5. 大数比较,找最大值)

[6. 完整代码](#6. 完整代码)

主函数完整流程

代码

1.题目

洛谷P1080 国王游戏(贪心 邻项交换法的例题)https://www.luogu.com.cn/problem/P1080

2.定义结构体存数据

每个大臣有左手数a、右手数b,用结构体统一管理

3.贪心排序规则

此解析来自:

解析贪心思想https://oi-wiki.org/basic/greedy/

结论

两个大臣 x、y

若 x.a * x.b < y.a * y.b,则 x 排在 y 前面。

全局所有大臣按这个规则升序排序,就是最优排队顺序

1LL 防止相乘 int 溢出,转成长整型计算

之后直接调用:sort(大臣数组, 大臣数组+n, cmp);

4.乘积太大存不下:用高精度

4.1 问题在哪

国王左手 + 几十个大臣左手不断相乘数值轻松突破 long long 上限,普通变量直接溢出报错 必须用数组模拟大整数(高精度)

4.2 我们要写两个高精度操作

  1. 大数 × 小整数作用:不断把前缀总乘积,乘上当前大臣左手
  2. 大数 ÷ 小整数作用:前缀乘积 ÷ 大臣右手,算出金币数

4.3 高精度存储规则

用一维数组存大数,低位存在数组下标小的位置 例:数字 1234存成:num[0]=4 , num[1]=3 , num[2]=2 , num[3]=1方便进位、借位运算

4.4 高精度 大数 × 小整数 函数

作用:遍历完一个大臣,前缀乘积要乘上该大臣左手数,更新总乘积

逻辑:逐位相乘 + 进位,从低位往高位算

4.5 高精度 大数 ÷ 小整数 函数

注:

1 .memset(res, 0, sizeof(res)); (memset 是 C/C++ 专门用来给内存赋值的函数)

这一行代码 = 给数组 "清零",因为上一组的数组还留在这里呢,memset( 数组名, 要填的值, 填多大空间 );

2 .reverse(res, res + res_len); (把一段数据的顺序 从头到尾反转)

字符串:reverse(起始位置, 结束位置); eg: reverse(s.begin(),s.end());

数组:reverse(数组名, 数组名 + 长度); eg: reverse(arr, arr + len);

3 .除法从高位向低位算

4.作用:前缀总乘积 ÷ 大臣右手数 = 该大臣金币

5.要求:返回商,向下取整,同时保留原大数不变(只用来算奖金,不修改乘积)

5. 大数比较,找最大值

我们每次算出一个大臣的奖金(大数),要和当前最大奖金对比,更新最大值

len_a:第一个大数的位数

len_b:第二个大数的位数

6. 完整代码

主函数完整流程:

  1. 读入 n
  2. 读国王左手 king_a、右手 king_b
  3. 读入 n 个大臣存入数组
  4. 调用 sort 按贪心规则排序
  5. 高精度数组初始化,存入国王左手数字
  6. 初始化最大奖金大数
  7. 循环遍历每一位大臣:
    1. 大数乘积 ÷ 当前大臣右手 → 得到金币
    2. 和最大值比较,更新最大值
    3. 大数乘积 × 当前大臣左手,更新前缀乘积
  8. 倒序输出最大奖金数组

代码:

注:本题部分讲解内容来源为豆包,请注意甄别

相关推荐
the3clipse1 小时前
视频编码技术如何赋能游戏性能优化:从硬件隔离到AI驱动的带宽革命
游戏·性能优化·音视频·视频编码·硬件加速·ai编码·自适应编码
jeffsonfu6 小时前
生成对抗网络(GAN)原理:生成器与判别器的“猫鼠游戏”
人工智能·游戏·生成对抗网络
解决小子14 小时前
【游戏作品设计解析】类魂游戏设计解析
游戏·业界资讯·游戏策划·游戏设计
k4m7v2pz1 天前
用中文编程语言写游戏:玄铁语言生命游戏的 macOS 适配实录
游戏·macos·玄铁·生命游戏·中文编程语言·玄铁中文编程
JQweryuiop7 天前
中小型游戏陪练工作室数字化管理实践:基于七彩屋电竞护航小程序订单、履约与绩效系统的落地复盘
大数据·游戏·小程序·架构
乌萨达8 天前
低配电脑玩手游怎么设置?4GB、8GB内存与模拟器选择指南
游戏·电脑·安卓模拟器·雷电模拟器
林川~0110 天前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
一孤程11 天前
游戏测试专题第七篇:游戏自动化测试实战
游戏·测试
一孤程11 天前
游戏测试专题第八篇:游戏安全测试与反外挂
游戏·测试
河南花仙子科技12 天前
小游戏社交裂变功能的高阶设计思路
大数据·科技·游戏