📜  寻找给定圆的两个部分的最小角度差的程序

📅  最后修改于: 2021-10-23 08:10:49             🧑  作者: Mango

将一个圆分成 n 块作为大小为 n 的数组。数组的第 i 个元素表示一件的角度。我们的任务是从这些部分制作两个连续的部分,使这两个部分的角度差异最小。
例子 :

Input : arr[] = {90, 90, 90, 90}
Output : 0
In this example, we can take 1 and 2 
pieces and 3 and 4 pieces. Then the 
answer is |(90 + 90) - (90 + 90)| = 0.

Input : arr[] = {170, 30, 150, 10}
Output : 0
In this example, we can take 1 and 4, 
and 2 and 3 pieces. So the answer is 
|(170 + 10) - (30 + 150)| = 0.

Input : arr[] = {100, 100, 160}
Output : 40

我们可以注意到,如果其中一个部分是连续的,那么所有剩余的部分也形成一个连续的部分。如果第一部分的角度等于 x,则第一部分和第二部分的角度差为 |x – (360 – x)| = |2 * x – 360| = 2 * |x – 180|。所以对于每个可能的连续部分,我们可以计算它的角度并更新答案。

C++
// CPP program to find minimum
// difference of angles of two
// parts of given circle.
#include 
using namespace std;
 
// Returns the minimum difference
// of angles.
int findMinimumAngle(int arr[], int n)
{
    int l = 0, sum = 0, ans = 360;
    for (int i = 0; i < n; i++) {
        // sum of array
        sum += arr[i];
 
        while (sum >= 180) {
 
            // calculating the difference of
            // angles and take minimum of
            // previous and newly calculated
            ans = min(ans, 2 * abs(180 - sum));
            sum -= arr[l];
            l++;
        }
 
        ans = min(ans, 2 * abs(180 - sum));
    }
    return ans;
}
 
// driver code
int main()
{
    int arr[] = { 100, 100, 160 };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << findMinimumAngle(arr, n) << endl;
    return 0;
}
 
// This code is contributed by "Abhishek Sharma 44"


Java
// java program to find minimum
// difference of angles of two
// parts of given circle.
import java.util.*;
 
class Count{
    public static int findMinimumAngle(int arr[], int n)
    {
        int l = 0, sum = 0, ans = 360;
        for (int i = 0; i < n; i++)
        {
            // sum of array
            sum += arr[i];
     
            while (sum >= 180)
            {
     
                // calculating the difference of
                // angles and take minimum of
                // previous and newly calculated
                ans = Math.min(ans,
                            2 * Math.abs(180 - sum));
                sum -= arr[l];
                l++;
            }
     
            ans = Math.min(ans,
                            2 * Math.abs(180 - sum));
        }
         
        return ans;
         
    }
     
    public static void main(String[] args)
    {
        int arr[] = { 100, 100, 160 };
        int n = 3;
        System.out.print(findMinimumAngle(arr, n));
    }
}
 
// This code is contributed by rishabh_jain


Python3
# java program to find minimum
# difference of angles of two
# parts of given circle.
import math
 
# function returns the minimum
# difference of angles.
def findMinimumAngle (arr, n):
    l = 0
    _sum = 0
    ans = 360
    for i in range(n):
         
        #sum of array
        _sum += arr[i]
         
        while _sum >= 180:
         
            # calculating the difference of
            # angles and take minimum of
            # previous and newly calculated
            ans = min(ans, 2 * abs(180 - _sum))
            _sum -= arr[l]
            l+=1
        ans = min(ans, 2 * abs(180 - _sum))
    return ans
     
# driver code
arr = [100, 100, 160]
n = len(arr)
print(findMinimumAngle (arr, n))
 
# This code is contributed by "Abhishek Sharma 44"


C#
// C# program to find minimum
// difference of angles of two
// parts of given circle.
using System;
 
class GFG
{
    public static int findMinimumAngle(int []arr, int n)
    {
        int l = 0, sum = 0, ans = 360;
        for (int i = 0; i < n; i++)
        {
            // sum of array
            sum += arr[i];
     
            while (sum >= 180)
            {
     
                // calculating the difference of
                // angles and take minimum of
                // previous and newly calculated
                ans = Math.Min(ans,
                      2 * Math.Abs(180 - sum));
                sum -= arr[l];
                l++;
            }
     
            ans = Math.Min(ans,
                        2 * Math.Abs(180 - sum));
        }
         
        return ans;
         
    }
     
    // Driver code
    public static void Main()
    {
        int []arr = { 100, 100, 160 };
        int n = 3;
        Console.WriteLine(findMinimumAngle(arr, n));
    }
}
 
// This code is contributed by vt_m


PHP
= 180)
        {
 
            // calculating the difference of
            // angles and take minimum of
            // previous and newly calculated
            $ans = min($ans, 2 *
                             abs(180 - $sum));
            $sum -= $arr[$l];
            $l++;
        }
 
        $ans = min($ans, 2 * abs(180 - $sum));
    }
    return $ans;
}
 
// Driver Code
$arr = array( 100, 100, 160 );
$n = sizeof($arr);
echo findMinimumAngle($arr, $n), "\n" ;
 
// This code is contributed by m_kit
?>


Javascript


输出 :

40