Number of triangles possible with given lengths of sticks which are powers of 2

08 Jun, 2022
Given an array of N integers where arr[i] denotes the number of sticks of length 2i. The task is to find the number of triangles possible with given lengths having area ≥ 0. Note: Every stick can only be used once.
Examples:  
Input: a[] = {1, 2, 2, 2, 2} Output: 3 All possible triangles are: (20, 24, 24), (21, 23, 23), (21, 22, 22).
Input: a[] = {3, 3, 3} Output: 3 
Approach: The main observation is that the triangles with area ≥ 0 can only be formed if there are three same lengths of sticks or one different and two similar lengths of sticks. Hence greedily iterate from the back and count the number of pairs of same length sticks available which is arr[i] / 2. But if there is a stick remaining, then a pair and a stick is used to form a triangle. In the end, the total number of sticks left is calculated which is 2 * pairs and the number of triangles that can be formed with these remaining sticks will be (2 * pairs) / 3. 
Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std; // Function to return the// number of positive area trianglesint countTriangles(int a[], int n){     // To store the count of    // total triangles    int cnt = 0;     // To store the count of pairs of sticks    // with equal lengths    int pairs = 0;     // Back-traverse and count    // the number of triangles    for (int i = n - 1; i >= 0; i--) {         // Count the number of pairs        pairs += a[i] / 2;         // If we have one remaining stick        // and we have a pair        if (a[i] % 2 == 1 && pairs > 0) {             // Count 1 triangle            cnt += 1;             // Reduce one pair            pairs -= 1;        }    }     // Count the remaining triangles    // that can be formed    cnt += (2 * pairs) / 3;    return cnt;} // Driver codeint main(){    int a[] = { 1, 2, 2, 2, 2 };    int n = sizeof(a) / sizeof(a[0]);    cout << countTriangles(a, n);     return 0;}
// Java implementation of the approachclass GFG{     // Function to return the// number of positive area trianglesstatic int countTriangles(int a[], int n){     // To store the count of    // total triangles    int cnt = 0;     // To store the count of pairs of sticks    // with equal lengths    int pairs = 0;     // Back-traverse and count    // the number of triangles    for (int i = n - 1; i >= 0; i--)    {         // Count the number of pairs        pairs += a[i] / 2;         // If we have one remaining stick        // and we have a pair        if (a[i] % 2 == 1 && pairs > 0)        {             // Count 1 triangle            cnt += 1;             // Reduce one pair            pairs -= 1;        }    }     // Count the remaining triangles    // that can be formed    cnt += (2 * pairs) / 3;    return cnt;} // Driver codepublic static void main(String[] args){    int a[] = { 1, 2, 2, 2, 2 };    int n = a.length;    System.out.println(countTriangles(a, n));}} // This code is contributed by Code_Mech.
# Python3 implementation of the approach # Function to return the# number of positive area trianglesdef countTriangles(a, n):     # To store the count of    # total triangles    cnt = 0     # To store the count of pairs of sticks    # with equal lengths    pairs = 0     # Back-traverse and count    # the number of triangles    for i in range(n - 1, -1, -1):         # Count the number of pairs        pairs += a[i] // 2         # If we have one remaining stick        # and we have a pair        if (a[i] % 2 == 1 and pairs > 0):             # Count 1 triangle            cnt += 1             # Reduce one pair            pairs -= 1             # Count the remaining triangles    # that can be formed    cnt += (2 * pairs) // 3    return cnt # Driver codea = [1, 2, 2, 2, 2]n = len(a)print(countTriangles(a, n)) # This code is contributed by mohit kumar
// C# implementation of the approachusing System; class GFG{             // Function to return the    // number of positive area triangles    static int countTriangles(int []a, int n)    {             // To store the count of        // total triangles        int cnt = 0;             // To store the count of pairs of sticks        // with equal lengths        int pairs = 0;             // Back-traverse and count        // the number of triangles        for (int i = n - 1; i >= 0; i--)        {                 // Count the number of pairs            pairs += a[i] / 2;                 // If we have one remaining stick            // and we have a pair            if (a[i] % 2 == 1 && pairs > 0)            {                     // Count 1 triangle                cnt += 1;                     // Reduce one pair                pairs -= 1;            }        }             // Count the remaining triangles        // that can be formed        cnt += (2 * pairs) / 3;        return cnt;    }         // Driver code    public static void Main()    {        int []a = { 1, 2, 2, 2, 2 };        int n = a.Length;        Console.WriteLine(countTriangles(a, n));    }} // This code is contributed by Ryuga
<?php// PHP implementation of the approach // Function to return the// number of positive area trianglesFunction countTriangles($a, $n){     // To store the count of    // total triangles    $cnt = 0;     // To store the count of pairs of sticks    // with equal lengths    $pairs = 0;     // Back-traverse and count    // the number of triangles    for ($i = $n - 1; $i >= 0; $i--)    {         // Count the number of pairs        $pairs += $a[$i] / 2;         // If we have one remaining stick        // and we have a pair        if ($a[$i] % 2 == 1 && $pairs > 0)        {             // Count 1 triangle            $cnt += 1;             // Reduce one pair            $pairs -= 1;        }    }     // Count the remaining triangles    // that can be formed    $cnt += (int)((2 * $pairs) / 3);    return $cnt;} // Driver code$a = array(1, 2, 2, 2, 2 );$n = sizeof($a);echo(countTriangles($a, $n)); // This code is contributed by Code_Mech.?>
<script> // Javascript implementation of the approach // Function to return the number// of positive area trianglesfunction countTriangles(a , n){         // To store the count of    // total triangles    var cnt = 0;         // To store the count of pairs    // of sticks with equal lengths    var pairs = 0;         // Back-traverse and count    // the number of triangles    for(let i = n - 1; i >= 0; i--)    {                 // Count the number of pairs        pairs += a[i] / 2;                 // If we have one remaining stick        // and we have a pair        if (a[i] % 2 == 1 && pairs > 0)        {                         // Count 1 triangle            cnt += 1;                         // Reduce one pair            pairs -= 1;        }    }         // Count the remaining triangles    // that can be formed    cnt += parseInt((2 * pairs) / 3);    return cnt;} // Driver codevar a = [ 1, 2, 2, 2, 2 ];var n = a.length; document.write(countTriangles(a, n)); // This code is contributed by aashish1995 </script>
3
 
Time Complexity: O(n)Auxiliary Space: O(1)
mohit kumar 29
Code_Mech
ankthon
aashish1995
rishavmahato348
triangle
Combinatorial
Mathematical
Mathematical
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Find the Number of Permutations that satisfy the given condition in an array
Probability of getting K heads in N coin tosses
Number of handshakes such that a person shakes hands only once
Ways to sum to N using Natural Numbers up to K with repetitions allowed
Largest permutation after at most k swaps
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
C++ Data Types
Merge two sorted arrays
Coin Change | DP-7