ในปัญหานี้ เราได้รับอาร์เรย์ที่แสดงถึงชิ้นส่วนของวงกลมตามมุมของวงกลม งานของเราคือสร้าง โปรแกรมเพื่อค้นหาความแตกต่างที่เล็กที่สุดของมุมสองส่วนของวงกลมที่กำหนดใน C++ .
คำอธิบายปัญหา − เราได้รับมุมของทุกส่วนของวงกลมในอาร์เรย์ เราจำเป็นต้องเชื่อมชิ้นงานในลักษณะที่ทั้งสองชิ้นที่ทำขึ้นมีมุมต่างกันน้อยที่สุด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
ang[] = {90, 45, 90, 135}

ผลลัพธ์
90
คำอธิบาย
นำที่ 1 และ 2 มารวมกัน เช่น 90 + 45 =135
นำที่ 3 และ 4 มารวมกัน เช่น 90 + 135 =225
ส่วนต่าง =225 - 135 =90
แนวทางการแก้ปัญหา
ที่นี่เราต้องรวมส่วนทั้งหมดให้เป็นสองส่วน ในการนั้น เราจำเป็นต้องแยกส่วนที่ต่อเนื่องกัน (ในตัวอย่าง เรานำ ang1 กับ ang3 มารวมกันไม่ได้)
ลองหามุมของตอนที่ 1 เป็น A กัน
แล้วมุมของ part2 จะเป็น 360 - A.
ความแตกต่างจะเป็น |A - (360 - A)| เราใช้ค่าสัมบูรณ์เนื่องจากมีเพียงมุมบวกเท่านั้น
การแก้สมการผลต่าง
2 * |A - 180| ค่านี้ต้องเป็นค่าต่ำสุด และสำหรับสิ่งนั้น เราจะพยายามรวมทุกส่วนของวงกลมที่เป็นไปได้และหาค่าต่ำสุดสำหรับ (2*|A - 180|)
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream>
#include <math.h>
using namespace std;
int CalcSmallDiffAng(int ang[], int n) {
int Left = 0, A = 0, minDiff = 360;
for (int i = 0; i < n; i++) {
A += ang[i];
while (A >= 180) {
minDiff = min(minDiff, 2 * abs(180 - A));
A -= ang[Left];
Left++;
}
minDiff = min(minDiff, 2 * abs(180 - A));
}
return minDiff;
}
int main() {
int ang[] = { 90, 45, 90, 135 };
int n = sizeof(ang) / sizeof(ang[0]);
cout<<"The smallest difference of angles of two parts of a given
circle is "<<CalcSmallDiffAng(ang, n);
return 0;
} ผลลัพธ์
The smallest difference of angles of two parts of a given circle is 90