Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Divide Chocolate (แบ่งช็อกโกแลต) ใน C++


สมมติว่าเรามีแท่งช็อกโกแลตหนึ่งแท่ง ประกอบด้วยชิ้นเล็กๆ (chunks) แต่ละชิ้นมีความหวาน (sweetness) กำหนดโดยรายการที่ชื่อว่า sweetness หากเราต้องการแบ่งช็อกโกแลตให้เพื่อน K คน เราจะเริ่มตัดแท่งช็อกโกแลตเป็น K+1 ชิ้น โดยใช้ K ครั้ง ตอนนี้แต่ละชิ้นประกอบด้วยชิ้นเล็กที่ติดกัน หากเราหยิบชิ้นที่มีความหวานรวมต่ำสุด และให้ชิ้นอื่นๆ แก่เพื่อน เราต้องหาความหวานรวมสูงสุดของชิ้นที่เราสามารถได้โดยการตัดช็อกโกแลตอย่างเหมาะสม

ดังนั้น หากอินพุทคือ sweetness = [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

  • counter := 0, temp := 0

  • for i := 0 ถึงขนาดของ v:

    • ถ้า temp ≥ maxVal: counter++, temp := 0

    • ถ้า i == ขนาดของ v: break

    • temp := temp + v[i]

  • คืนค่า true เมื่อ counter ≥ cuts

  • จาก main method:

    • maxa := -1, n := ขนาดของ s

    • low := 0, high := 0

    • for i := 0 ถึง n-1: low := min(low, s[i]), high := high + s[i]

    • high++

    • while low < high:

      • mid := low + (high - low + 1) / 2

      • ถ้า ok(s, k+1, mid) จริง: low := mid มิฉะนั้น high := mid - 1

    • คืนค่า low

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    bool ok(vector& 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& s, int k) {
        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;
    }
};

int main() {
    Solution ob;
    vector v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    cout << (ob.maximizeSweetness(v, 5));
    return 0;
}

อินพุต

{1,2,3,4,5,6,7,8,9}, 5

เอาต์พุต

6