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

สามเหลี่ยมเส้นรอบรูปสูงสุดจากอาร์เรย์ใน C++

ข้อความปัญหา

ได้รับอาร์เรย์ของจำนวนเต็มที่ไม่เป็นลบ หา 3 องค์ประกอบจากอาร์เรย์ที่สร้างสามเหลี่ยมได้และมีเส้นรอบรูปสูงสุด

ตัวอย่าง

ถ้าอาร์เรย์อินพุตคือ {5, 1, 3, 5, 7, 4} เส้นรอบรูปสูงสุดคือ (7 + 5 + 5) = 17

อัลกอริทึม

  • เรียงอาร์เรย์จากมากไปน้อย (Non-increasing) ดังนั้นตัวแรกจะมากที่สุด และตัวสุดท้ายน้อยที่สุด
  • ถ้า 3 ตัวแรกของอาร์เรย์ที่เรียงแล้วสร้างสามเหลี่ยมได้ จะเป็นสามเหลี่ยมเส้นรอบรูปสูงสุด

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

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

int getMaxPerimeter(int *arr, int n) {
    sort(arr, arr + n, greater<int>());
    int maxPerimeter = 0;
    for (int i = 0; i < n - 2; ++i) {
        if (arr[i] < arr[i + 1] + arr[i + 2]) {
            maxPerimeter = max(maxPerimeter, arr[i] + arr[i+1] + arr[i+2]);
            break;
        }
    }
    if (maxPerimeter) {
        return maxPerimeter;
    }
    return -1;
}

int main() {
    int arr[] = {5, 1, 3, 5, 7, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    int maxPerimeter;
    maxPerimeter = getMaxPerimeter(arr, n);
    if (maxPerimeter != -1) {
        cout << "Max perimeter = " << maxPerimeter << endl;
    } else {
        cout << "Triangle formation is not possible" << endl;
    }
    return 0;
}

ผลลัพธ์

Max perimeter = 17

คำอธิบาย

เงื่อนไขสามเหลี่ยม: ผลรวมของด้านสองด้านต้องมากกว่าด้านที่สาม สำหรับอาร์เรย์ที่เรียงจากมากไปน้อย หาก a ≥ b ≥ c แล้ว a < b + c ก็เพียงพอ (เพราะ b + c > a หมายความว่า b + a > c และ c + a > b เป็นจริงอัตโนมัติ)

การ break หลังเจอชุดแรกที่ทำให้เป็นสามเหลี่ยมได้ เนื่องจากชุดแรกจะมีเส้นรอบรูปมากที่สุดแล้ว (เพราะเรียงจากมากไปน้อย)