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

เพิ่มปริมาตรทรงสี่เหลี่ยมมุมฉากสูงสุดจากผลรวมด้านที่กำหนดใน C++

ได้รับผลรวมของ 3 ด้านของทรงสี่เหลี่ยมมุมฉาก (Cuboid) คือ ความยาว (L), ความกว้าง (B), ความสูง (H) ปริมาตรคำนวณจาก V = L × B × H

ปริมาตรจะสูงสุดเมื่อ 3 ด้านมีค่าใกล้เคียงกันมากที่สุด (หลักการ AM-GM inequality: ผลคูณสูงสุดเมื่อตัวเลขเท่ากัน)

ตัวอย่าง

S = 6

ด้านที่เป็นไปได้:

[1,1,4] → V=4
[1,2,3] → V=6
[2,2,2] → V=8 ← สูงสุด

Output: 8

S = 10

L = 10/3 = 3 (เหลือ 7)
B = 7/2 = 3 (เหลือ 4)
H = 4
V = 3×3×4 = 36

Output: 36

แนวทางแก้ปัญหา

  1. รับค่า sum (ผลรวม 3 ด้าน)
  2. L = sum / 3 (หารจำนวนเต็ม) แล้ว sum -= L
  3. B = sum / 2 แล้ว sum -= B
  4. H = sum (เศษที่เหลือ)
  5. คืนค่า L × B × H
ลำดับการคำนวณ L,B,H ไม่สำคัญ เพราะการหารจำนวนเต็มจะกระจายเศษให้เท่าที่สุด

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

#include <iostream>
using namespace std;

long long maximizeVolume(int sumOfSides) {
    long long length = sumOfSides / 3;
    sumOfSides -= length;
    long long breadth = sumOfSides / 2;
    long long height = sumOfSides - breadth;
    return length * breadth * height;
}

int main() {
    int sos = 12;
    cout << "Maximized volume: " << maximizeVolume(sos) << endl;
    return 0;
}

ผลลัพธ์

Maximized volume: 64
12 → L=4, B=4, H=4 → 4×4×4=64

การพิสูจน์ทางคณิตศาสตร์ (AM-GM Inequality)

สำหรับจำนวนบวก a,b,c ที่ a+b+c = S คงที่:

(a+b+c)/3 ≥ ³√(abc)
S/3 ≥ ³√V
V ≤ (S/3)³

ความเท่ากันเกิดเมื่อ a = b = c = S/3 แต่ถ้า S ไม่หาร 3 ลงตัว ให้กระจายเศษให้เท่าที่สุด (ต่างกันสูงสุด 1)

กรณี S ใหญ่ – ใช้ long long

หาก S ใหญ่ (เช่น 10^9) ผลคูณอาจล้น int ควรใช้ long long (64-bit) ซึ่งรองรับถึง ~9×10¹⁸