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

【算法日记 11】贪心之美:用“相邻交换法”秒杀乱序求极值问题

【算法日记 11】贪心之美用“相邻交换法”秒杀乱序求极值问题 场景引入百醇的终极摆放艺术今天遇到了一道看似毫无头绪的排列极值题题目大意有NNN根百醇每根有长度AiA_iAi​和美味值BiB_iBi​。我们要把它们首尾相接排成一排。假设第iii根的起点坐标是xix_ixi​我们要最大化总美味值公式∑(xi⋅Bi)\sum (x_i \cdot B_i)∑(xi​⋅Bi​)。数据规模N≤104N \le 10^4N≤104。这道题的物理画面是越往后放的百醇它的坐标xxx就越大。直觉告诉我们如果一根百醇美味值BBB极大我们应该尽量把它往后放去乘上那个巨大的坐标xxx。如果一根百醇长度AAA极大我们应该尽量把它往前放这样能把后面所有百醇的坐标xxx都向后狠狠推一大步但直觉终归是直觉如果一根百醇“又长又美味”我们到底该把它放哪这时我们需要祭出贪心算法的终极武器相邻交换法微扰法✨ 满级数学降维相邻交换法证明假设我们已经排好了一个极其完美的序列。现在我们从队伍里揪出相邻的两根百醇前面的叫甲后面的叫乙。设在甲之前前面百醇累积的坐标是XXX。【情况 1甲在前乙在后】甲的起点是XXX对总分的贡献是X⋅B甲X \cdot B_甲X⋅B甲​乙的起点是XA甲X A_甲XA甲​对总分的贡献是(XA甲)⋅B乙(X A_甲) \cdot B_乙(XA甲​)⋅B乙​两人总贡献X⋅B甲X⋅B乙A甲⋅B乙X \cdot B_甲 X \cdot B_乙 A_甲 \cdot B_乙X⋅B甲​X⋅B乙​A甲​⋅B乙​【情况 2如果两人互换位置乙在前甲在后】乙的起点是XXX对总分的贡献是X⋅B乙X \cdot B_乙X⋅B乙​甲的起点是XA乙X A_乙XA乙​对总分的贡献是(XA乙)⋅B甲(X A_乙) \cdot B_甲(XA乙​)⋅B甲​两人总贡献X⋅B甲X⋅B乙A乙⋅B甲X \cdot B_甲 X \cdot B_乙 A_乙 \cdot B_甲X⋅B甲​X⋅B乙​A乙​⋅B甲​ 见证奇迹的时刻对比上面两个总贡献的式子你会发现前面两项X⋅B甲X⋅B乙X \cdot B_甲 X \cdot B_乙X⋅B甲​X⋅B乙​是一模一样的唯一的区别就在于尾巴上的交叉乘积A甲⋅B乙A_甲 \cdot B_乙A甲​⋅B乙​对比A乙⋅B甲A_乙 \cdot B_甲A乙​⋅B甲​。既然我们要让总分最大那谁排前面更好呢只要A甲⋅B乙A乙⋅B甲A_甲 \cdot B_乙 A_乙 \cdot B_甲A甲​⋅B乙​A乙​⋅B甲​那么甲就绝对应该排在乙的前面如果两边同时除以B甲B_甲B甲​和B乙B_乙B乙​这就等价于A甲B甲A乙B乙\frac{A_甲}{B_甲} \frac{A_乙}{B_乙}B甲​A甲​​B乙​A乙​​。即“长度/美味值”的性价比越高的越该排在前面。我们就这样用初中数学极其优雅地推导出了绝杀的排序比较器 隐藏的“百亿级”数据炸弹逻辑完美了但在敲代码前必须要警惕数据溢出N≤104N \le 10^4N≤104Ai,Bi≤104A_i, B_i \le 10^4Ai​,Bi​≤104。坐标最大可能达到104×10410810^4 \times 10^4 10^8104×104108。单个百醇的得分X⋅BiX \cdot B_iX⋅Bi​可能达到108×104101210^8 \times 10^4 10^{12}108×1041012。总得分累加起来可能达到104×1012101610^4 \times 10^{12} 10^{16}104×10121016。101610^{16}1016远远超过了普通int的极限2×1092 \times 10^92×109所以所有涉及坐标计算和求和的变量必须统统使用long long 光速 AC 模板#includeiostream#includevector#includealgorithmusingnamespacestd;// 将百醇打包成结构体structPocky{longlonga;// 长度longlongb;// 美味值};// 核心比较器相邻交换法推导出的贪心法则boolcmp(constPockyp1,constPockyp2){// 如果 p1 放前面带来的收益 p2 放前面带来的收益p1 就该排前面// 用乘法代替除法完美避免浮点数精度误差returnp1.a*p2.bp2.a*p1.b;}voidsolve(){intn;cinn;vectorPockyp(n);// 分别读入长度和美味值for(inti0;in;i)cinp[i].a;for(inti0;in;i)cinp[i].b;// 按照贪心法则进行光速排序时间复杂度 O(N log N)sort(p.begin(),p.end(),cmp);longlongtotal_delicious0;// 记录总美味值longlongcurrent_x0;// 记录当前累积的坐标起点// 遍历计算得分for(inti0;in;i){total_deliciouscurrent_x*p[i].b;// 加上当前的得分current_xp[i].a;// 起点向后推移}couttotal_delicious\n;}intmain(){// 竞赛必备读写极速引擎ios::sync_with_stdio(false);cin.tie(0);intt;if(cint){while(t--){solve();}}return0;} 首席质检员的总结“相邻交换法”是算法竞赛证明贪心策略的最强武器之一。当你遇到“一维数组排列求极值”、“任务调度求最小延迟”、“打怪兽求最小掉血”等题目时只要你在脑子里想象揪出相邻的两个元素换一换往往就能一秒击碎出题人的障眼法写出完美无瑕的自定义sort比较器

相关文章:

【算法日记 11】贪心之美:用“相邻交换法”秒杀乱序求极值问题

🚀【算法日记 11】贪心之美:用“相邻交换法”秒杀乱序求极值问题 📍 场景引入:百醇的终极摆放艺术 今天遇到了一道看似毫无头绪的排列极值题:题目大意:有 NNN 根百醇,每根有长度 AiA_iAi​ 和美…...

解决标准工程库中遇到少了STM32F1 固件包

keil中编译后出现下面错误: ../Core/Inc/stm32f1xx_hal_conf.h(338): error: #5: cannot open source input file "stm32f1xx_hal_uart.h": No such file or directory 整个项目都找不到 stm32f1xx_hal_uart.h 这个文件。 要么 UART 的 HAL 驱动文件没有…...

3分钟解决游戏手柄兼容性难题:ViGEmBus的神奇力量

3分钟解决游戏手柄兼容性难题:ViGEmBus的神奇力量 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 还在为心爱的游戏手柄在PC上无法使用而烦恼吗&…...

从认证到实现:功能安全与Class B在工业驱动中的核心实践

1. 工业驱动设备为什么需要功能安全认证 第一次接触功能安全认证时,我也觉得这不过是又一张"纸面证书"。直到亲眼见过电机失控把金属板材甩出十几米远,才真正理解为什么变频器和伺服驱动器必须通过功能安全认证。现在随便打开一台主流品牌的工…...

晶晨A311D开发板:从零构建Ubuntu/Debian固件的完整指南

1. 环境准备:搭建Ubuntu编译环境 第一次接触晶晨A311D开发板时,我也被复杂的编译环境吓到过。但实际搭建起来,只要跟着步骤走,半小时就能搞定。建议使用Ubuntu 20.04 LTS系统,这是经过验证最稳定的选择。我试过在Ubunt…...

ClearerVoice-Studio实操手册:WAV/AVI/MP4多格式输入与WAV标准输出规范

ClearerVoice-Studio实操手册:WAV/AVI/MP4多格式输入与WAV标准输出规范 1. 开篇:你的AI语音处理工具箱 如果你正在为嘈杂的会议录音发愁,或者想把多人对话视频里的某个声音单独提取出来,那你来对地方了。ClearerVoice-Studio&am…...

双膜储气柜的选择指南建议

Q1: 如何从公开信息初步判断双膜气柜可靠性与工艺适应性?A1: 可交叉验证以下核心维度:工艺细节:查看是否采用多次焊接成型、全密封处理,是否有泄漏监测、主动泄压等安全设计;环境适配:耐温范围、防冻设计、…...

CSS如何监控样式表的加载状态_通过JS监听onload与onerror事件

link元素的onload/onerror事件在Chrome 93/Firefox 65支持但Safari(iOS 17/macOS 14)仍不触发;需优先监听原生事件,失败时降级轮询document.styleSheets并安全检查cssRules。link元素的onload和onerror事件在Chrome/Firefox中可用…...

避坑指南:RK3588部署YOLOv8时,模型转换与板端环境那些容易忽略的细节

RK3588部署YOLOv8避坑实战:模型转换与板端环境的七个关键陷阱 当你在RK3588上部署YOLOv8时,是否遇到过这样的场景:按照官方文档一步步操作,却在模型转换或板端推理时莫名失败?这很可能是因为忽略了某些"隐藏规则…...

VS2022里NX/UG二次开发模板不显示?别慌,这份保姆级修复指南帮你搞定

VS2022里NX/UG二次开发模板不显示?终极解决方案全解析 当你满怀期待地在VS2022中准备开始NX/UG二次开发时,却发现模板向导神秘消失——这种挫败感我深有体会。作为一位经历过多次版本迁移的工业软件开发者,我完全理解这种"明明按照教程…...

终极卡牌批量生成工具:让桌游设计效率提升300%的完整指南

终极卡牌批量生成工具:让桌游设计效率提升300%的完整指南 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/C…...

从传统后端到阿里大模型应用层:我的两年转型之路,收藏这份进阶指南!

本文分享了一位传统后端开发转向大模型应用层的成长历程。作者通过五年学习,从初识LLM API使用,到深入理解模型原理,再到掌握RAG技术和流式编程,最终成功获得字节超30%涨幅的Agent开发岗位。文章强调提示词写作、模型微调、开源项…...

NSE-每日交易数据全量分析报告-包含股票债券期权等多类型金融工具-2022年交易记录-支持市场分析与算法训练

NSE每日交易数据全量分析报告 引言与背景 NSE(印度国家证券交易所)作为印度最大的证券交易所之一,其每日交易数据(Bhavcopy)包含了市场上所有交易品种的详细信息,对于金融分析、算法训练和投资决策具有极高…...

AI原生研发成本黑洞诊断手册(附可落地的TCO/TTV双轨评估表)

第一章:AI原生研发成本黑洞的本质解构 2026奇点智能技术大会(https://ml-summit.org) AI原生研发并非简单地将模型“接入”系统,而是一场从基础设施、数据契约、服务边界到可观测性的全栈重构。其成本黑洞常被误归因于GPU算力开销,实则根植于…...

C#实战编程:从基础练习到WinForm应用开发

1. C#基础语法快速上手 第一次接触C#时,我被它清晰的语法结构惊艳到了。作为微软主推的编程语言,C#既保留了C系语言的严谨性,又具备现代语言的简洁特性。先来看个最简单的例子: Console.WriteLine("Hello World!");这行…...

企业网络安全审计实施全流程:步骤、工具、策略与落地方法

企业网络安全审计实施全流程:步骤、工具、策略与落地方法企业安全审计:定义与目标1. 什么是企业安全审计?2. 安全审计核心目标安全审计:实施流程图一、实施步骤1:明确审计范围标题:安全审计:确定…...

OpenVINO™正式进入 llama.cpp:GGUF 模型现已支持 Intel CPU、GPU 与 NPU

作者:武卓 过去,在 llama.cpp 里跑 GGUF 模型这件事,逻辑一直很清晰: 选模型、下模型、运行起来。 简单、直接,而且足够高效。 这也是为什么 GGUF 和 llama.cpp 直到今天依然是本地大模型开发里最受欢迎的组合之一…...

【个人思考】“女强人、都市丽人、超级女孩:三种女性叙事,三种人生剧本”

本文原创作者:姚瑞南 AI-agent 大模型运营专家/音乐人/野生穿搭model,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。&#…...

CTF逆向实战:从RC4到Base64,详解CTFshow萌新赛逆向题解

1. RC4加密算法在CTF逆向中的实战应用 RC4算法作为CTF逆向题目中的常客,经常出现在各类比赛中。这种流加密算法看似简单,但在实际解题过程中往往会遇到各种变种和陷阱。记得我第一次遇到RC4加密的题目时,完全不知道从何下手,现在回…...

Obsidian Weread插件:构建个人数字阅读知识库的智能桥梁

Obsidian Weread插件:构建个人数字阅读知识库的智能桥梁 【免费下载链接】obsidian-weread-plugin Obsidian Weread Plugin is a plugin to sync Weread(微信读书) hightlights and annotations into your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirr…...

4步实战精通微信聊天记录解密技术

4步实战精通微信聊天记录解密技术 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 微信作为中国最主流的即时通讯工具,每天承载着数十亿条重要对话,但当你需要迁移设备、恢复误删记…...

构建真正AI-ready的可观测体系(不是简单加个Prometheus):LLM服务、向量DB、微批Pipeline全链路告警设计实战

第一章:AI原生软件研发监控告警体系搭建 2026奇点智能技术大会(https://ml-summit.org) AI原生软件具备动态推理路径、模型权重漂移、Prompt变异响应、多模态输入不确定性等独特可观测性挑战,传统基于微服务的监控范式难以覆盖其全生命周期异常。构建面…...

跳表(Skip List):思想、优劣与应用场景完全解读

一、为什么需要跳表?在计算机科学中,我们经常需要一种数据结构,既能快速查找,又能高效插入和删除。数组的二分查找虽然快(O(log n)),但插入删除却需要移动大量元素(O(n))…...

基于STM32的四轴飞行器控制系统设计

一、系统概述 四轴飞行器(Quadcopter)是一种垂直起降(VTOL)多旋翼无人机,通过四个无刷电机的转速差实现姿态控制与稳定飞行。本系统以STM32高性能微控制器为核心,融合传感器融合、姿态解算、PID控制、电机驱…...

如何快速安全弹出USB设备:终极USB磁盘弹出工具使用指南

如何快速安全弹出USB设备:终极USB磁盘弹出工具使用指南 【免费下载链接】USB-Disk-Ejector A program that allows you to quickly remove drives in Windows. It can eject USB disks, Firewire disks and memory cards. It is a quick, flexible, portable altern…...

B站m4s转换工具:3分钟解锁缓存视频的终极解决方案

B站m4s转换工具:3分钟解锁缓存视频的终极解决方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过这样的困扰&#xf…...

Qt步进电机上位机控制程序源代码,支持串口、Tcp网口、Udp网络三种端口类型,详细注释和讲解

Qt步进电机上位机控制程序源代码Qt跨平台C/C语言编写 支持串口Tcp网口Udp网络三种端口类型 提供,提供详细注释和人工讲解 1.功能介绍: 可控制步进电机的上位机程序源代码,基于Qt库,采用C/C语言编写。 支持串口、Tcp网口、Udp网络三…...

如何解决地理数据可视化难题:geojson2svg的坐标映射与样式控制方案

如何解决地理数据可视化难题:geojson2svg的坐标映射与样式控制方案 【免费下载链接】geojson2svg Converts GeoJSON to SVG string given SVG view port size and maps extent. 项目地址: https://gitcode.com/gh_mirrors/ge/geojson2svg 在Web地图开发中&am…...

LaTeX格式设置避坑指南:5个新手最常踩的排版雷区

LaTeX格式设置避坑指南:5个新手最常踩的排版雷区 第一次用LaTeX写论文时,我盯着屏幕上歪七扭八的公式和怎么都对齐不了的标题,差点把键盘摔了。后来才知道,这些看似简单的格式问题,往往藏着LaTeX设计哲学里那些"反…...

基于STM32LXXX的数字电位器(TPL0401A-10QDCKRQ1)驱动应用程序设计

一、简介: TPL0401A-10QDCKRQ1 是德州仪器(TI)推出的一款车规级单通道数字电位器,主要面向STM32LXXX等低功耗平台。 二、主要技术特性: 核心规格:128抽头(7位分辨率)、10kΩ端到端电阻、IC接口、SC-70-6小型封装、车规级(AEC-Q100)[-40℃至+125℃]。 电气特性:工…...