สมมติว่าเรากำลังพยายามแจกจ่ายคุกกี้ให้กับเด็ก แต่เราควรให้คุกกี้แก่เด็กแต่ละคนไม่เกินหนึ่งคุกกี้ ตอนนี้เด็กแต่ละคนมีปัจจัยความโลภ gi ซึ่งเป็นขนาดต่ำสุดของคุกกี้ที่เด็กจะพอใจ และคุกกี้ j แต่ละตัวมีขนาด sj เมื่อ sj>=gi เราสามารถกำหนดคุกกี้ j ให้กับลูก i และลูก i จะพึงพอใจ เป้าหมายของเราคือเพิ่มจำนวนเนื้อหาย่อยให้มากที่สุดและส่งออกจำนวนสูงสุด
ดังนั้น หากอินพุตเป็น [1,2], [1,2,3] ผลลัพธ์จะเป็น 2 ลูกจะมี 2 ลูกและคุกกี้ 3 ตัว ปัจจัยความโลภของเด็ก 2 คนคือ 1, 2 ตอนนี้เรามีคุกกี้ 3 ชิ้นและขนาดของคุกกี้ก็ใหญ่พอที่จะทำให้เด็กๆ พอใจได้ทั้งหมด ดังนั้นผลลัพธ์ที่ได้คือ 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
จัดเรียงอาร์เรย์ g
-
เรียงลำดับอาร์เรย์ s
-
ผม :=0, j =0
-
ในขณะที่ (i <ขนาดของ g และ j <ขนาดของ s) ทำ −
-
ถ้า g[i] <=s[j] แล้ว −
-
(เพิ่ม i ขึ้น 1)
-
-
(เพิ่มขึ้น j โดย 1)
-
-
กลับมา
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(), g.end()); sort(s.begin(), s.end()); int i = 0, j = 0; while (i < g.size() && j < s.size()) { if (g[i] <= s[j]) i++; j++; } return i; } }; main(){ Solution ob; vector<int> v = {1,2}, v1 = {1,2,3}; cout << (ob.findContentChildren(v, v1)); }
อินพุต
{1,2}, {1,2,3}
ผลลัพธ์
2