เราได้รับจำนวนช็อกโกแลตในกล่องที่เรียงติดกันเป็นอาร์เรย์ และตัวเลข k ที่แทนจำนวนนักเรียนที่จะแจกช็อกโกแลต งานคือเลือกกล่องที่ติดกัน使得ผลรวมของช็อกโกแลตในกล่องเหล่านั้นสามารถแจกให้นักเรียน k คนเท่ากันได้ และต้องทำให้จำนวนช็อกโกแลตเป็นสูงสุด
สำหรับเรื่องนี้ เราจะวนอาร์เรย์จากซ้ายไปขวาและเริ่มบวกจำนวนช็อกโกแลตแล้วหารด้วย k หากหารลงตัว (เศษเท่ากับ 0) ให้เก็บผลรวมนี้ในตัวแปร เมื่อเคลื่อนที่ต่อไป เราทำซ้ำกระบวนการจนได้ผลรวมสูงสุดที่เป็นไปได้ ปัญหาคือการหาผลรวมสูงสุดของ subarray ที่หารด้วย k ลงตัว
ตัวอย่าง
อินพุต
Choco[] = { 1, 2, 4, 5, 2, 8, 3, 5 } k = 3
เอาต์พุต — จำนวนช็อกโกแลตสูงสุดที่แจกให้นักเรียน k คนเท่ากัน — 5
คำอธิบาย — Subarray สูงสุดคือ { 5, 2, 8 } ผลรวมช็อกโกแลตคือ 15 แจกเท่ากัน นักเรียน 3 คนได้คนละ 5 ชิ้น
หมายเหตุ — กล่องติดกันและดัชนีคือ { 3, 4, 5 }
อินพุต
Choco[] = { 2, 3, 7, 5, 4, 8, 2, 6 } k = 5
เอาต์พุต — จำนวนช็อกโกแลตสูงสุดที่แจกให้นักเรียน k คนเท่ากัน — 7
วิธีการที่ใช้ในโปรแกรม
- รับอาร์เรย์จำนวนเต็ม arr[] ที่มีจำนวนช็อกโกแลตในกล่องติดกัน
- จำนวนองค์ประกอบ 'n' แทนจำนวนกล่อง
- รับจำนวนนักเรียน 'k' เป็นอินพุต
- ฟังก์ชัน maxChocolate(int arr[], int n, int k) รับสามอาร์กิวเมนต์ — อาร์เรย์, ขนาด, และจำนวนนักเรียน k
- เริ่มวน arr[] จากจุดเริ่มต้นด้วยลูป for
- ใช้ตัวแปร sum และ maxSum sum เก็บผลรวมขององค์ประกอบติดกันของ subarray
- maxSum ใช้เก็บผลรวมสูงสุดที่พบจนถึงตอนนี้
- ใน nested for loop บวกองค์ประกอบต่อเนื่องและตรวจสอบว่า sum%k ให้เศษ 0 หรือไม่ และถ้า sum > maxSum ให้อัปเดต maxSum
- สุดท้าย maxSum จะมีจำนวนช็อกโกแลตสูงสุดที่หารด้วย k ลงตัว
- คืนค่าผลลัพธ์เป็น maxSum/k ซึ่งคือจำนวนช็อกโกแลตที่นักเรียนแต่ละคนได้
ตัวอย่างโค้ด
#include <stdio.h>
// หาจำนวนช็อกโกแลตสูงสุดที่แจกให้นักเรียน k คนเท่ากัน
int maxChocolates(int arr[], int n, int k) {
int sum;
int maxSum = 0;
for(int i = 0; i < n; i++) {
sum = 0;
for(int j = i; j < n; j++) {
sum += arr[j];
if(sum % k == 0 && sum > maxSum)
maxSum = sum;
}
}
// แจกเท่ากันให้ 'k' นักเรียน
return (maxSum / k);
}
int main() {
int arr[] = { 2, 7, 6, 1, 4, 5, 5, 3 };
int n = 8;
int k = 3;
printf("จำนวนช็อกโกแลตสูงสุดที่แจกให้นักเรียน k คนเท่ากัน: %d", maxChocolates(arr, n, k));
return 0;
}
ผลลัพธ์
หากรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ —
จำนวนช็อกโกแลตสูงสุดที่แจกให้นักเรียน k คนเท่ากัน — 11