当前位置: 首页 > news >正文

邻项交换贪心小记

邻项交换贪心小记

主要参考来源 [OI-wiki 贪心](贪心 - OI Wiki)。wiki原话:用排序法常见的情况是输入一个包含几个(一般一到两个)权值的数组,通过排序然后遍历模拟计算的方法求出最优值。

直接看题目吧,然后证明啥的也不严谨,主要是方便自己回顾的。

LG1080 [NOIP 2012 提高组] 国王游戏

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

重新安排队伍顺序,最小化奖赏最多的大臣的奖赏。

左右手上的数分别记为 \(a_i,b_i\),现在考虑相邻的两个大臣 \(x,y\),他们之间的排列是否最优。假设两人前面大臣所有 \(a_i\) 的乘积为 \(s\)

目前排列方式,两人奖赏的较大值为 \(\max\{\frac{s}{b_x},\frac{s\cdot a_{x}}{b_y} \}\)

同理,若两人位置交换,奖赏较大值为 \(\max\{\frac{s}{b_y},\frac{s\cdot a_y}{b_x} \}\)

如果当前排列更优,则有:

\[\max\{\frac{s}{b_x},\frac{s\cdot a_{x}}{b_y} \}<\max\{\frac{s}{b_y},\frac{s\cdot a_y}{b_x} \} \]

提出 \(s\) 再通分,得到最终形式

\[\max(b_y,a_x\cdot b_x)<\max(b_x,a_y\cdot b_y) \]

则最后的序列需要满足这个条件,写入 std::sort 中的 cmp 函数即可。

然后这题要高精度所以我这次就没重写了,如果有一些细节的话我也不知道。

LG2123 皇后游戏

饺子醋来了,闲话后面再说。

形式化地讲,设第 \(i\) 位大臣有一个二元组 \((a_i,b_i)\),第 \(i\) 位大臣获得的奖金数目 \(c_i\) 可以表示为(定义 \(c_0=0\)):

\[c_i=\max\{c_{i-1},\sum_{j=1}^{i}a_j \}+b_i \]

现在请对每位大臣排序,最小化最大的 \(c_i\)

为了方便,还是定义一个前缀和 \(s_i=\sum_{j=1}^{i} a_j\)。变成 \(c_i=\max(c_{i-1},s_i)+b_i\)

显然 \(c_i\) 是递增的,于是只需要最小化 \(c_n=\max(c_{n-1},s_n)+b_n\)

\(b_n\) 写在里面,再把 \(c_{n-1}\) 拆开,可以变成

\[c_n=\max\{s_{n}+b_n,\max(c_{n-2},s_{n-1})+b_{n-1}+b_{n}\} \]

继续把 \(c_{n-2}\) 拆开,可以变成

\[c_n=\max\{s_n+b_n,s_{n-1}+b_{n-1}+b_n,\max(c_{n-3},s_{n-2})+b_{n-2}+b_{n-1}+b_{n} \} \]

然后一直拆 \(c\),直到拆到 \(c_1\),可以得出 \(c_n\) 可以写作 \(n\) 个式子的最大值,如下

\[\begin{align} c_n&=\max_{i=1}^{n}(s_i+\sum_{j=i}^{n}b_j)\\ &=\max_{i=1}^{n}(\sum_{i=1}^{j}a_j+\sum_{j=i}^{n}b_j) \end{align} \]

然后就可以邻项交换贪心了,思考一下交换某相邻两项是否会让答案更优。交换第 \(x\) 和第 \((x+1)\) 项,只会影响 \((\sum_{j=1}^{x}a_j+\sum_{j=x}^{n}b_j)\)\((\sum_{j=1}^{x+1}a_j+\sum_{j=x+1}^{n}b_j)\) 两项的值。令 \(\sum_{j=1}^{x-1}a_j=pre,\sum_{j=x+2}^{n}b_j=suf\)。则如果目前排列更优,则有

\[\max(pre+a_x+b_x+b_{x+1}+suf,pre+a_x+a_{x+1}+b_{x+1}+suf)<\max(pre+a_{x+1}+b_{x+1}+b_{x}+suf,pre+a_{x+1}+a_{x}+b_x +suf) \]

\[\max(a_x+b_x+b_{x+1},a_x+a_{x+1}+b_{x+1})<\max(a_{x+1}+b_{x+1}+b_{x},a_{x+1}+a_{x}+b_{x}) \]

\[\max(-a_{x+1},-b_x)<\max(-a_x,-b_{x+1}) \]

\[\min(a_{x+1},b_x)>\min(a_x,b_{x+1}) \]

好的基本思考就这些,写入 std::sortcmp 排序。

但是由于有的时候会有相邻几项 \(\min(a_y,b_x)\)\(\min(a_x,b_y)\) 相同,导致远在天边的两项虽然应该交换顺序但是没有交换,所以排序的时候若相等,再考虑对第二第三关键字再排序,底层逻辑就没深究了,具体见代码吧。

const int N=200005;
struct node{ll a,b;
}a[N];
inline bool cmp(node x,node y){if(min(x.b,y.a)==min(y.b,x.a))return y.a==x.a?x.b>y.b:y.a>x.a;return min(x.b,y.a)>min(y.b,x.a);
}
int n;
int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%lld%lld",&a[i].a,&a[i].b);sort(a+1,a+1+n,cmp);ll s=0,c=0;for(int i=1;i<=n;++i){s+=a[i].a;c=max(s,c)+a[i].b;}printf("%lld\n",c);}return 0;
}

后记

这题目居然是紫题没绷住,那看来 NOIP2025 T2 的紫也没那么难?不过这个 cmp 的细节确实有点东西,以后要注意,如果是 ICPC 赛制估计要罚时多发红温了。以及多倍经验,感觉 n 年后再来看降绿了。

嗯最后大美雨课堂又忘记做了,以及这个是大美课上写的虽然提一嘴无意义。

http://www.rkmt.cn/news/117429.html

相关文章:

  • 2025年12月对焊机厂家推荐:行业权威盘点与焊接设备品质红榜发布 - 品牌鉴赏师
  • 人才发展ℓℓ 人才盘点怎么做?这篇完全应用手册给出答案
  • 12月最新论文降AI率全流程,附免费降AI方法+降AI率工具
  • javascript: Convert Word documents (.docx files) to HTML
  • FPGA中的 LUT6
  • 基于SpringBoot+Vue的宠物代遛系统设计与实现
  • 【即插即用模块】AAAI2025 | 高频 + 空间感知!新 HS-FPN 让“极小目标”不再消失!SCI保二区争一区!彻底疯狂!!!
  • 【24h服务】微信公众号评论点赞好友能看到吗?微信留言点赞下单怎么取消? - 速递信息
  • 一个销售数据分析机器人的诞生:看 Dify 如何在 DMS 助力下实现自动化闭环
  • 模具管理系统新解:如何用数字化打通全生命周期,降本30%?
  • Agentic AI提示工程的商业价值:如何应对AI技术的快速迭代?
  • SAP CDS 带参数传输的视图
  • Android-packages/modules-由来及子目录介绍
  • 28、Linux 文件共享与备份全攻略
  • 健康管理实训室:解锁康养技能提升新路径
  • 基于大数据的哔哩哔哩视频数据分析可视化系统开题报告
  • springboot+jspm宠物医院药房管理系统的研究与实现_47e81477
  • C#中的静态成员、常量和只读变量
  • 架构设计:ElasticSearch+HBase 海量存储架构设计与实现
  • 机械手弧焊节气设备
  • 一种“看起来很稳”,却暗藏坑点的恒流 PWM 驱动电路
  • 42、Linux编程:软件开发工具探索与实践
  • 微信朋友圈集赞神器靠谱吗?微信点赞群5000人微信投票是真的吗? - 速递信息
  • 43、Linux 编程:GNU 许可证与入门级 Shell 脚本编写
  • 为何选择具备制造业基因的厂商,是ERP与OA系统集成成功的关键
  • 计算机毕业设计springboot数据结构课程在线答疑系统 基于 SpringBoot 的“数据结构”智慧答疑与学习互助平台 SpringBoot 驱动的数据结构课程实时问答与资源分享系统
  • 告别重复编码!10+顶级开发工具,引爆程序员效率革命
  • 2026年河北省职业院校技能大赛中职组“网络建设与运维”竞赛样题
  • C语言5——常见关键字 define定义常量 表达式求值
  • 水面上划过的涟漪遇到礁石会拐弯,声波撞上超表面也得乖乖听话。今天咱们来折腾COMSOL里水声超表面的反射特性计算,这玩意儿在声学隐身和定向传声领域正热乎着呢