สมมติว่าเรามีช็อกโกแลตแท่งหนึ่งแท่งที่ประกอบด้วยชิ้นบางชิ้น ในแต่ละชิ้นมีความหวานที่กำหนดโดยรายการที่เรียกว่าความหวาน ถ้าเราต้องการแบ่งช็อกโกแลตให้เพื่อนๆ ชาว K เราเริ่มตัดช็อกโกแลตแท่งเป็นชิ้น K+1 โดยใช้การตัด K ตอนนี้แต่ละชิ้นจะประกอบด้วยชิ้นที่ต่อเนื่องกัน ถ้าเรานำชิ้นที่มีความหวานรวมขั้นต่ำและมอบชิ้นอื่นๆ ให้เพื่อนของเรา เราต้องหาความหวานสูงสุดของชิ้นนั้นโดยการตัดแท่งช็อกโกแลตให้เหมาะสมที่สุด
ดังนั้นหากอินพุตเป็นเหมือนความหวาน =[1,2,3,4,5,6,7,8,9], K =5 ผลลัพธ์จะเป็น 6 เนื่องจากคุณสามารถแบ่งช็อกโกแลตเป็น [1,2 ได้ ,3], [4,5], [6], [7], [8], [9] ชิ้นนี้.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน ok() ซึ่งจะใช้อาร์เรย์ v, cuts, maxVal,
-
ตัวนับ :=0, อุณหภูมิ :=0
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <=ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
ถ้า temp> =maxVal แล้ว
-
(เพิ่มตัวนับทีละ 1)
-
อุณหภูมิ :=0
-
-
ถ้าฉันมีขนาดเท่ากับ v แล้ว −
-
ออกจากวง
-
-
temp :=temp + v[i]
-
-
คืนค่าเป็นจริงเมื่อตัวนับ>=ตัด
-
จากวิธีหลัก ให้ทำดังนี้:
-
สูงสุด :=-1
-
n :=ขนาดของ s
-
ต่ำ :=0, สูง :=0
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ต่ำ :=ต่ำสุดของค่าต่ำสุดและ s[i]
-
สูง :=สูง + s[i]
-
-
(เพิ่มขึ้นสูง 1)
-
ในขณะที่ต่ำ <สูง ทำ -
-
กลาง :=ต่ำ + (สูง - ต่ำ + 1) / 2
-
ถ้า ok(s, k + 1, mid) เป็นจริง −
-
ต่ำ :=กลาง
-
-
มิฉะนั้น
-
สูง :=กลาง - 1
-
-
-
กลับต่ำ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: bool ok(vector <int> v, int cuts, int maxVal){ int counter = 0; int temp = 0; for (int i = 0; i <= v.size(); i++) { if (temp >= maxVal) { counter++; temp = 0; } if (i == v.size()) { break; } temp += v[i]; } return counter >= cuts; } int maximizeSweetness(vector<int>& s, int k) { int maxa = -1; int n = s.size(); int low = 0; int high = 0; for (int i = 0; i < n; i++) { low = min(low, s[i]); high += s[i]; } high++; while (low < high) { int mid = low + (high - low + 1) / 2; if (ok(s, k + 1, mid)) low = mid; else high = mid - 1; } return low; } }; main(){ Solution ob; vector<int> v = {1,2,3,4,5,6,7,8,9}; cout << (ob.maximizeSweetness(v, 5)); }
อินพุต
{1,2,3,4,5,6,7,8,9}, 5
ผลลัพธ์
6