尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

邻项交换贪心小记

邻项交换贪心小记
📅 发布时间:2026/6/19 2:23:30
好像是很经典的东西,记录一下

邻项交换贪心小记

主要参考来源 [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::sort 的 cmp 排序。

但是由于有的时候会有相邻几项 \(\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 年后再来看降绿了。

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

相关新闻

  • 2025年12月对焊机厂家推荐:行业权威盘点与焊接设备品质红榜发布 - 品牌鉴赏师
  • 人才发展ℓℓ 人才盘点怎么做?这篇完全应用手册给出答案
  • 12月最新论文降AI率全流程,附免费降AI方法+降AI率工具

最新新闻

  • Citra图形设置终极指南:从模糊到高清的完整解决方案
  • 2026最新领英(LinkedIn)账户合规与风控申诉全指南:从算法机制到效率恢复实操
  • 完全掌握Blender资源宝典:从入门到实战的5大核心模块深度解析
  • C++多线程编程入门教程(非常详细)
  • 停止手动输入Prompt!AI编码圈的“循环工程”正在颠覆写代码的方式
  • TrafficMonitor插件:终极指南,让你的Windows任务栏变身全能信息中心

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号