ในปัญหานี้ เราได้รับอาร์เรย์ที่แสดงชิ้นส่วนของวงกลมตามมุมของวงกลม งานของเราคือสร้าง โปรแกรมหาความต่างมุมน้อยที่สุดของสองส่วนของวงกลมที่กำหนดใน C++
คำอธิบายปัญหา – เราได้รับมุมของทุกชิ้นส่วนของวงกลมในอาร์เรย์ เราต้องรวมชิ้นส่วนเพื่อให้ได้สองชิ้นที่มีความต่างของมุมน้อยที่สุด
ตัวอย่างเพื่อความเข้าใจ
อินพุต
ang[] = {90, 45, 90, 135}
เอาต์พุต
90
คำอธิบาย
รวมชิ้นที่ 1 และ 2 คือ 90 + 45 = 135
รวมชิ้นที่ 3 และ 4 คือ 90 + 135 = 225
ความต่าง = 225 - 135 = 90
วิธีแก้ปัญหา
ที่นี่เราต้องรวมทุกส่วนให้เป็นสองส่วน และต้องใช้ส่วนที่ติดกัน (ในตัวอย่างไม่สามารถเอา ang1 และ ang3 มารวมกันได้)
ให้มุมของส่วนที่ 1 เป็น A
มุมของส่วนที่ 2 จะเป็น 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