ICPC 2023 Nanjing R L 題 Elevator

[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…