[ProblemDiscription]\color{blue}{\texttt{[Problem Discription]}}[Problem Discription]

在这里插入图片描述

来源:洛谷。侵权则删。

[Analysis]\color{blue}{\texttt{[Analysis]}}[Analysis]

贪心。优先运送楼层高的货物,在能装下的情况下尽量多装。

因为运送货物的代价仅和最高楼层的货物有关,假设一次运送货物时的最高楼层为 hhh,那么无论你剩下的货物楼层高还是低,代价都是 hhh 是固定的。

既然这样,我们应该优先把尽量高的货物都运送上去,剩下来的都是高度低的货物,后面的代价会减小。

排序后,从楼层高的货物开始装填,能装下就装下。注意处理特殊情况:即电梯剩余空间只有 111,但贪心需要装大小为 222 的货物时是装不下的。但是既然电梯空间还有剩余,就不应该浪费,应该找到下一个大小为 111 的货物。

指针来回的挪动可能会导致 T,因此按 w=1,2w=1,2w=1,2 把货物分成两批,分别用一个指针来维护。这样可以保证时间复杂度为 O(n)O(n)O(n)

总时间复杂度 O(nlog⁡n)O(n \log n)O(nlogn),主要瓶颈在于排序。

但是,并没有做完!

这道题对代码能力的要求还是很高的。代码中有非常多容易出错的地方!相信这个贪心还是很多选手都能想到的,但是能不能写出来也是一个重要的问题。

具体的细节看代码中的注释。

Code\color{blue}{\text{Code}}Code

const int N=1e5+100;struct Marchandise{int amount,high;Marchandise(int a=0,int h=0){amount=a;high=h;}bool operator < (const Marchandise &c) const{return high>c.high;}
}a[N],b[N];//w=1,2 的分别存 int n,r1,r2;
ll lim,ans;int OZDY(){n=read();lim=read();ans=r1=r2=0;for(int i=1;i<=n;i++){int c=read(),w=read(),f=read();if (w==1) a[++r1]=(Marchandise){c,f};else b[++r2]=(Marchandise){c,f};}sort(a+1,a+r1+1);sort(b+1,b+r2+1);a[r1+1]=(Marchandise){0,0};b[r2+1]=(Marchandise){0,0};//没有这两行应该也没问题int l1=1,l2=1;ll remain=lim;while (l1<=r1&&l2<=r2){if (b[l2].high>=a[l1].high&&remain!=1){//楼层高的优先int tmp=(int)min((ll)b[l2].amount,remain>>1);if (remain==lim) ans+=b[l2].high;remain-=(tmp<<1);b[l2].amount-=tmp;//到这一行,remain 和 amount 至少一个被清零。if (!b[l2].amount){l2++;if (remain==0) remain=lim;continue;//注意一定要 continue,不然可能就直接进入下一个 if,开始装填 l2+1 了,但 l2+1 不一定是下一个装填的货物(可能是 l1,但不可能是 l2+2)。}if (l2>r2) break;if (remain==0){ans+=1ll*b[l2].high*((b[l2].amount<<1)/lim);//注意括号b[l2].amount%=(lim>>1);if (!b[l2].amount){l2++;remain=lim;}else{ans+=b[l2].high;remain=lim-(b[l2].amount<<1);l2++;}}}else{if (remain==1){a[l1].amount--;remain=lim;//这句话别忘了if (!a[l1].amount) l1++;continue;}//电梯剩余空间为 1 特殊处理int tmp=(int)min((ll)a[l1].amount,remain);if (remain==lim) ans+=a[l1].high;remain-=tmp;a[l1].amount-=tmp;if (!a[l1].amount){l1++;if (remain==0) remain=lim;//都恰好拿完 continue;}if (l1>r1) break;if (remain==0){ans+=1ll*a[l1].high*(a[l1].amount/lim);a[l1].amount%=lim;if (!a[l1].amount){l1++;remain=lim;}else{ans+=a[l1].high;remain=lim-a[l1].amount;l1++;}}}} //每进入循环一次,要么 l1 加一要么 l2 加一,保证时间复杂度if (remain==0) remain=lim; //注意维护关键变量(其实出循环后 remain 应该不会为 0,但是维护一下以免出乱子,反正不费事)while (l2<=r2){if (remain==1) remain=lim;//只剩下 w=2 的货物了,剩余的 1 空间没用了int tmp=(int)min((ll)b[l2].amount,remain>>1);//下面的语句几乎就是复制过来的。if (remain==lim) ans+=b[l2].high;remain-=(tmp<<1);b[l2].amount-=tmp;if (!b[l2].amount) l2++;//这里不需要 continue 了,因为下一个装的一定是 l2+1if (l2>r2) break;if (remain==0){ans+=1ll*b[l2].high*((b[l2].amount<<1)/lim);b[l2].amount%=(lim>>1);if (!b[l2].amount){l2++;remain=lim;}else{ans+=b[l2].high;remain=lim-(b[l2].amount<<1);l2++;}}}while (l1<=r1){int tmp=(int)min((ll)a[l1].amount,remain);if (remain==lim) ans+=a[l1].high;remain-=tmp;a[l1].amount-=tmp;if (!a[l1].amount) l1++;if (l1>r1) break; if (remain==0){ans+=1ll*a[l1].high*(a[l1].amount/lim);a[l1].amount%=lim;if (!a[l1].amount){l1++;remain=lim;}else{ans+=a[l1].high;remain=lim-a[l1].amount;l1++;}}}//虽然代码看着很长,但是最主要的四段几乎就是复制粘贴,修改一些小细节printf("%lld\n",ans);return n;
}int main(){int T=read();while (T--) OZDY();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95931.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95931.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95931.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

81-dify案例分享-零代码用 Dify 使用梦 AI 3.0 多模态模型,免费生成影视级视频

1.前言 即梦AI作为字节跳动旗下的AI绘画与视频生成平台&#xff0c;近年来不断推出新的模型和功能&#xff0c;以提升用户体验和创作能力。 即梦AI 3.0是即梦AI的最新版本&#xff0c;于2025年4月发布&#xff0c;标志着其在中文生图模型上的重大升级。该版本不仅在中文生图能…

SQL 进阶指南:视图的创建与使用(视图语法 / 作用 / 权限控制)

在 SQL 操作中&#xff0c;你是否遇到过 “频繁查询多表关联的固定结果”“不想让他人看到表中的敏感字段” 这类问题&#xff1f;比如 “每周都要查‘技术部员工的姓名、职位、薪资’”&#xff0c;每次都写多表关联语句很麻烦&#xff1b;又比如 “给实习生开放数据查询权限&…

【全部更新完毕】2025数学建模国赛C题思路代码文章高教社杯全国大学生数学建模-NIPT 的时点选择与胎儿的异常判定

B题全部更新完毕 包含完整的文章全部问题的代码、结果、图表 完整内容请看文末最后的推广群NIPT 的时点选择与胎儿的异常判定 摘要 在问题一中&#xff0c;我们以无创产前检测&#xff08;NIPT&#xff09;数据为研究对象&#xff0c;围绕“胎儿 Y 染色体浓度”(记为 (V)) 随孕…

Redis(43)Redis哨兵(Sentinel)是什么?

Redis Sentinel&#xff08;哨兵&#xff09;是一种用于管理 Redis 实例的高可用性解决方案。它提供了监控、通知和自动故障转移等功能&#xff0c;确保 Redis 服务在发生故障时能够自动恢复&#xff0c;提供高可用性和可靠性。以下是详细介绍 Redis Sentinel 的功能及其代码示…

蓓韵安禧DHA纯植物藻油纯净安全零添加守护母婴健康

在母婴健康领域&#xff0c;选择合适的营养补充品至关重要。纯植物藻油DHA源自纯净藻类&#xff0c;有效规避了海洋重金属污染的风险&#xff0c;确保安全无隐患。配方坚持零添加香精、色素和防腐剂&#xff0c;避免不必要的化学物质摄入&#xff0c;让妈妈和宝宝更安心。同时&…

钉钉 AI 深度赋能制造业 LTC 全流程:以钉钉宜搭、Teambition 为例

制造业 LTC 流程痛点剖析​在制造业&#xff0c;线索到现金&#xff08;LTC&#xff0c;Lead to Cash&#xff09;的全流程包含从潜在客户线索的发现、商机培育、销售转化、订单执行到最终收款的一系列复杂环节。传统制造业在这一流程中面临诸多挑战&#xff1a;客户需求的多样…

理解UE4中C++17的...符号及enable_if_t的用法及SFINAE思想

下面是一段C17的代码&#xff1a;//函数1&#xff1a;template <typename... BufferTypes,std::enable_if_t<std::conjunction<CanAppendBufferType<std::decay_t<BufferTypes>>...>::value> * nullptr> inline explicit FCompositeBuffer(Buff…

安全419正式公布《甲方安全建设精品采购指南》案例首推运营商行业数据安全核心推荐厂商

在数字经济加速渗透与《网络数据安全管理条例》全面实施的双重背景下&#xff0c;运营商作为数据要素流通的核心枢纽&#xff0c;其安全防护体系建设已成为数字基础设施保障的关键环节。近日&#xff0c;安全 419 正式公布《甲方安全建设精品采购指南》&#xff0c;从近 300 个…

基础词根-汇总

ros rus粗糙 ris cos cus cis切lite文字 late面 侧面ven 来 cess走/agdotect 覆盖 covercele 聚集 加速 gre 聚集&#xff0c;accumu聚集gress 抵达 靠近&#xff0c;aggressive侵略性humor humir 大地 土地chron 时间 time&#xff0c;宇宙的宙lumi 光lightviv vil volun vot/…

JVM中常见的GC垃圾收集器

文章目录 目录 1. Serial GC&#xff08;串行收集器&#xff09; 2. Parallel GC&#xff08;并行收集器&#xff09; 3. CMS&#xff08;Concurrent Mark-Sweep&#xff0c;并发标记 - 清除&#xff09; 4. G1&#xff08;Garbage-First&#xff0c;垃圾优先&#xff09; …

嵌入式C语言之链表冒泡排序

链表冒泡排序一是可以交换指针域的值&#xff0c;二是可以交换指针typedef struct st_node{int score;struce st_node *next;}Node,*LinkList;LinkList createList(){Node *head (Node *)malloc(sizeof(Node));if(NULL head){printf("内存分配失败!"):return NULL;…

远场代码学习_FDTD_farfield

项目4.2 farfield3d - Script command在3D模拟中将给定的功率或场剖面监视器或直线数据集投射到远场。返回电场强度|E| 2。语法描述 out farfield3d("mname",f, na, nb, illumination, periodsa, periodsb, index, direction)&#xff1b; 将给定的功率或场分布监…

Adobe Illustrator(Ai) 2022安装教程与下载地址

Adobe Illustrator&#xff08;通常简称 AI&#xff09;是一款由 Adobe 公司开发的、基于矢量图形的专业设计软件。它与 Photoshop&#xff08;基于位图/像素&#xff09;和 InDesign&#xff08;专注于页面排版&#xff09;并称为数字创意领域的“三巨头”&#xff0c;是平面设…

小迪web自用笔记27

框架就是一些封装好的东西*上节课补&#xff1a;JS负责美化框架的&#xff08;发送HTTP请求前端&#xff0c;js相当于前端并且附加上一些连接后端的功能。&#xff09;&#xff0c;JAVA是后端。PHPthink&#xff08;用的最多的框架&#xff09;URL&#xff1a;原&#xff1a;ht…

创建阿里云ECS实例操作(免费试用版)

目录 1、进入阿里云ECS控制台 2、创建ECS实例 3、重置实例密码 4、远程登陆实例 5、查看ECS信息 6、安装apache服务 7、端口规则设置 8、访问测试 9、释放实例 1、进入阿里云ECS控制台 https://www.aliyun.com/ 2、创建ECS实例 3、重置实例密码 4、远程登陆实例 5、查…

JVM相关 4|JVM调优与常见参数(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必会知识点汇总

目录&#xff1a;&#x1f9e0; 一、JVM调优目标1. 调优核心目标2. 调优常见问题&#x1f9e9; 二、JVM调优核心参数详解1. 堆内存相关参数2. 垃圾回收器相关参数3. GC日志与性能监控4. 元空间&#xff08;Metaspace&#xff09;调优5. 栈内存调优6. 其他关键参数&#x1f4cc;…

HOT100--Day13--104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树

HOT100–Day13–104. 二叉树的最大深度&#xff0c;226. 翻转二叉树&#xff0c;101. 对称二叉树 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;二叉树。 关键&#xff1a;要深刻理解《递归》 104. 二叉树的最大深度 方法&#xff1a;递归 思路&…

Maven 从 0 到 1:安装、配置与依赖管理一站式指南

Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南一、Maven 是什么&#xff1f;二、核心概念&#xff1a;POM三、Maven 是如何工作的&#xff1f;—— 仓库机制四、安装Maven五、在 IntelliJ IDEA 里配置…

k8s,v1.30.4,安装使用docker

一.前置概念Docker 与 Kubernetes 共用同一个 containerd 进程 时&#xff0c;只要满足以下 3 个条件&#xff0c;就不会冲突&#xff1a;检查点要求原因cgroup-driverkubelet 与 containerd 必须同为 systemd二者不一致会导致 Pod 无法调度Unix socketkubelet 指向 /run/conta…

开源AI智能名片链动2+1模式S2B2C商城小程序服务提升复购率和转介绍率的研究

摘要&#xff1a;本文聚焦于开源AI智能名片链动21模式S2B2C商城小程序在提升客户复购率和转介绍率方面的作用。服务对于促进客户复购和转介绍的重要性不言而喻&#xff0c;维护老客户的成本远低于开发新客户&#xff0c;微商通过推出各项服务来赢得客户忠诚。本文深入探讨开源A…