ในปัญหานี้ เราได้รับอาร์เรย์ที่แสดงถึงชิ้นส่วนของวงกลมตามมุมของวงกลม งานของเราคือสร้าง โปรแกรมเพื่อค้นหาความแตกต่างที่เล็กที่สุดของมุมสองส่วนของวงกลมที่กำหนดใน 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