每日一題:leetcode1338 3n塊披薩

給你一個披薩,它由 3n 塊不同大小的部分組成,現在你和你的朋友們需要按照如下規則來分披薩:

  • 你挑選?任意?一塊披薩。
  • Alice 將會挑選你所選擇的披薩逆時針方向的下一塊披薩。
  • Bob 將會挑選你所選擇的披薩順時針方向的下一塊披薩。
  • 重復上述過程直到沒有披薩剩下。

每一塊披薩的大小按順時針方向由循環數組?slices?表示。

請你返回你可以獲得的披薩大小總和的最大值。

輸入:slices = [1,2,3,4,5,6]
輸出:10
解釋:選擇大小為 4 的披薩,Alice 和 Bob 分別挑選大小為 3 和 5 的披薩。然后你選擇大小為 6 的披薩,Alice 和 Bob 分別挑選大小為 2 和 1 的披薩。你獲得的披薩總大小為 4 + 6 = 10 。
輸入:slices = [8,9,8,6,1,1]
輸出:16
解釋:兩輪都選大小為 8 的披薩。如果你選擇大小為 9 的披薩,你的朋友們就會選擇大小為 8 的披薩,這種情況下你的總和不是最大的。

提示:

  • 1 <= slices.length <= 500
  • slices.length % 3 == 0
  • 1 <= slices[i] <= 1000

思路:

首先,每一次選擇都是可以自由選擇披薩,但是選擇完成之后,左右兩邊披薩則是不能選擇,所以可以簡化題目,看成在循環列表中,選取n/3個不連續的元素的最大值。

兩種解法:1、類似于小偷偷家的動態規劃? 2、貪心+優先隊列模擬取數

這里只介紹第2種方法(第1種有空補上。。)

這道題目中,直觀想到的貪心策略是每一步選取最大的一塊。但以[8,9,8,1,2,3]為例,如果我們第一步選取了9,剩下的元素就變成了[1,2,3],我們最大只能選擇3,這樣的總和就只有12,而顯然選取兩個8可以得到16的總和,是更優的。

如果我們可以反悔就好了。問題是,怎么反悔?在上面的例子中,我們第一步選9之后,如果直接刪除兩個8,那就失去了反悔的機會,因為后面再也不會處理到它們了。所以,我們需要刪除兩個8對應的節點,同時保留它們的信息。信息保留在哪里?只能是9所對應的節點。

我們在選取9之后,將左右兩個節點刪除,同時將9修改為8+8?9=7,這樣我們后面仍然有機會選到這個7,也就相當于反悔了對9的選擇,而去選擇了左右兩邊的兩個8。

重復這樣的操作,直到選取了n/3個元素為止,我們就得到了需要的最優解。

為什么我們的反悔操作一定是同時選擇左右兩個元素呢?因為我們是從大到小處理所有元素的,所以左右兩邊的元素一定不大于中間的元素,如果我們只選取其中的一個,是不可能得到更優解的。

ac code O(nlogn):


import java.util.Comparator;
import java.util.PriorityQueue;public class Node<T> {public T data;public int index;public Node<T> pre;public Node<T> next;public Node(){}public Node(T data) {this.data = data;}
}
class Solution {public int maxSizeSlices(int[] slices) {PriorityQueue<Node<Integer>> pq = new PriorityQueue<>(new Comparator<Node<Integer>>() {@Overridepublic int compare(Node<Integer> o1, Node<Integer> o2) {return o2.data - o1.data; // 從大到小進行排序}});int n = slices.length;Node[] nodes = new Node[n];int step = 0;int maxStep = n / 3;int ans = 0;boolean[] vis = new boolean[n];for (int i=0;i<n;i++) {nodes[i] = new Node(slices[i]);nodes[i].index = i;pq.add(nodes[i]);}for (int i=0;i<n;i++) {nodes[i].pre = nodes[(i-1+n)%n];nodes[i].next = nodes[(i+1)%n];}while (step < maxStep) {Node cur = pq.poll();if (!vis[cur.index]) {step += 1;ans += (int)cur.data;cur.data = (int)cur.pre.data + (int)cur.next.data - (int)cur.data;vis[cur.pre.index] = true;vis[cur.next.index] = true;// 這里需要注意,需要將前后節點進行刪除。cur.pre = cur.pre.pre;cur.pre.next = cur;cur.next = cur.next.next;cur.next.pre = cur;pq.add(cur); // 后悔操作
//                System.out.println(step + " " + cur.index + " " + ans);}}return ans;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42580.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SCSS 學習筆記 和 vscode下載live sass compiler插件配置

1、下載livelive sass compiler插件并配置 // 在 已有代碼 下面 添加下面 代碼&#xff0c;一般剛剛下載打開最后一行是&#xff1a;// "liveSassCompile.settings.autoprefix": [],// 所以直接 把下面復制進去保存就行"liveSassCompile.settings.autoprefix&qu…

MySQL:在MySQL中實現toStartOfQuarter和toStartOfWeek等函數

文章目錄 在 MySQL 中實現 ClickHouse 日期函數&#xff1a;toStartOfYear/toStartOfQuarter/toStartOfMonth/toMonday/toStartOfWeektoStartOfYeartoStartOfQuartertoStartOfMonthtoStartOfWeek/toMonday 在 MySQL 中實現 ClickHouse 日期函數&#xff1a;toStartOfYear/toSta…

基于Java+SpringBoot+Vue的烏魯木齊南山冰雪旅游服務網站【源碼+論文+演示視頻+包運行成功】

博主介紹&#xff1a;?csdn特邀作者、博客專家、java領域優質創作者、博客之星&#xff0c;擅長Java、微信小程序、Python、Android等技術&#xff0c;專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推…

MVCC 是否徹底解決了事物的隔離性 ?

目錄 1. 什么是 MVCC 2. MVCC 是否徹底解決了事物的隔離性 3. MySQL 中如何實現共享鎖和排他鎖 4. MySQL 中如何實現悲觀鎖和樂觀鎖 1. 什么是 MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并發控制&#xff09;是一種多版本并發控制機制&…

webpack 和 ts 簡單配置及使用

如何使用webpack 與 ts結合使用 新建項目 &#xff0c;執行項目初始化 npm init -y會生成 {"name": "tsdemo01","version": "1.0.0","description": "","main": "index.js","scripts&…

Spring的ApplicationEvent簡單使用

ApplicationEvent以及Listener是Spring為我們提供的一個事件監聽、訂閱的實現&#xff0c;內部實現原理是觀察者設計模式&#xff0c;設計初衷也是為了系統業務邏輯之間的解耦&#xff0c;提高可擴展性以及可維護性。事件發布者并不需要考慮誰去監聽&#xff0c;監聽具體的實現…

自動駕駛數據集匯總

1.Nuscenes 數據集鏈接&#xff1a;nuScenes nuscenes數據集下有多個任務&#xff0c;涉及Detection&#xff08;2D/3D&#xff09;、Tracking、prediction、激光雷達分割、全景任務、規劃控制等多個任務&#xff1b; nuScenes數據集是一個具有三維目標注釋的大型自動駕駛數…

【ARM 嵌入式 編譯系列 10.3 -- GNU elfutils 工具小結】

文章目錄 什么是 GNU elfutils?GNU elfutils 常用工具有哪些?objcopy 常用參數有哪些?GNU binutils和GNU elfutils區別是什么?上篇文章:ARM 嵌入式 編譯系列 10.2 – 符號表與可執行程序分離詳細講解 什么是 GNU elfutils? GNU elfutils是一個開源的工具集,用于處理ELF…

2023-8-15差分矩陣

題目鏈接&#xff1a;差分矩陣 #include <iostream>using namespace std;const int N 1010;int n, m, q; int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c) {b[x1][y1] c;b[x1][y2 1] - c;b[x2 1][y1] - c;b[x2 1][y2 1] c; }int main…

基于SOLIDWORKS配置功能建立塑料模具標準件庫

在塑料模具的設計過程中&#xff0c;建立其三維模型對于后續進行CAE分析和CAM加工是非常重要的。除了型腔和型芯以外&#xff0c;塑料模具中的標準件很多&#xff0c;如推桿、導柱、導套、推板、限位釘等&#xff0c;這些對于不同的產品是需要反復調用的。目前&#xff0c;我國…

汽車OTA活動高質量發展的“常”與“新”

伴隨著車主的頻繁崔更&#xff0c;車企除了卷硬件、拼價格&#xff0c;逐漸將精力轉移到汽車全生命周期的常用常新。時至下半年&#xff0c;車企OTA圈愈發熱鬧&#xff0c;以新勢力、新實力為代表新一代車企&#xff0c;OTA運營活動逐漸進入高質量發展期。 所謂高質量&#xf…

記錄--webpack和vite原理

這里給大家分享我在網上總結出來的一些知識&#xff0c;希望對大家有所幫助 前言 每次用vite創建項目秒建好&#xff0c;前幾天用vue-cli創建了一個項目&#xff0c;足足等了我一分鐘&#xff0c;那為什么用 vite 比 webpack 要快呢&#xff0c;這篇文章帶你梳理清楚它們的原理…

FFmpeg 靜態庫編譯錯誤匯總

今天使用靜態庫編譯發現 了錯誤 這個只有在arm64 的編譯上 存在 。armeabi-v7a不存在問題 ld: error: relocation R_AARCH64_ADD_ABS_LO12_NC cannot be used against symbol ff_cos_16384; recompile with -fPIC 解決方案列舉匯總 有很多 大家如果有同樣的問題可以一一測試。…

c++ 虛函數

虛函數的作用就是當一個類繼承另一個類時&#xff0c;兩個類有同名函數&#xff0c;當你使用指針調用時你希望使用子類的函數而不是父類的函數&#xff0c;那么請使用 virutal 和 override 關鍵詞 看代碼&#xff1a; #include <iostream> #include <string> #in…

Kotlin開發筆記:集合和逆變協變

Kotlin開發筆記&#xff1a;集合和逆變協變 Kotlin中的集合 基本的集合類型 Kotlin中的集合類型和Java差不多&#xff0c;不過有些在名稱上可能有出入&#xff0c;下面是Kotlin中的一些基本集合類型&#xff1a; 類型介紹Pair兩個值的元組Triple三個值的元組Array經過索引的…

去掉鼠標系列之一: 語雀快捷鍵使用指南

其實應該是系列之二了&#xff0c;因為前面寫了一個關于Interlij IDEA的快捷鍵了。 為什么要寫這個了&#xff0c;主要是覺得一會兒用鼠標&#xff0c;一會兒鍵盤&#xff0c;一點兒不酷&#xff0c;我希望可以一直用鍵盤&#xff0c;拋開鼠標。后面陸續記錄一下各個軟件的快捷…

高效使用ChatGPT之ChatGPT客戶端

ChatGPT客戶端&#xff0c;支持Mac, Windows, and Linux 下載地址見文章結尾 軟件截圖 Windows: Mac&#xff1a; 說明 chatgpt桌面版&#xff0c;相比于網頁版的chatgpt&#xff0c;最大的特色是支持歷史聊天對話記錄導出&#xff0c;且支持三種格式&#xff1a;PNG、PDF、…

由淺入深詳解四種分布式鎖

在多線程環境下&#xff0c;為了保證數據的線程安全&#xff0c;鎖保證同一時刻&#xff0c;只有一個可以訪問和更新共享數據。在單機系統我們可以使用synchronized鎖或者Lock鎖保證線程安全。synchronized鎖是Java提供的一種內置鎖&#xff0c;在單個JVM進程中提供線程之間的鎖…

小程序的數據綁定和事件綁定

小程序的數據綁定 1.需要渲染的數據放在index.js中的data里 Page({data: {info:HELLO WORLD,imgSrc:/images/1.jpg,randomNum:Math.random()*10,randomNum1:Math.random().toFixed(2)}, }) 2.在WXML中通過{{}}獲取數據 <view>{{info}}</view><image src"{{…

C++ std::thread

若要使用線程類std::thread&#xff0c;則需包含<thread>頭文件。 創建線程 std::thread表示一個線程。線程對象是不可復制或賦值的&#xff0c;但可以移動(move)&#xff0c;如移動構造或移動賦值。 當構造std::thread對象時&#xff0c;需給構造函數輸入一個參數&am…