Count number of triangles possible for the given sides range - GeeksforGeeks

07 Apr, 2021
Given four integers A, B, C, and D, the task is to find the number of distinct sets (X, Y, and Z) where X, Y and Z denotes the length of sides forming a valid triangle. A ≤ X ≤ B, B ≤ Y ≤ C, and C ≤ Z ≤ D.Examples:  
Input: A = 2, B = 3, C = 4, D = 5 Output: 7 Explanation: Possible Length of Side of Triangles are – {(2, 3, 4), (2, 4, 4), (2, 4, 5), (3, 3, 4), (3, 3, 5), (3, 4, 4) and (3, 4, 5)}Input: A = 1, B = 1, C = 2, D = 2 Output: 1 Explanation: Only possible length of sides we can choose triangle is (1, 2, 2)  
Naive Approach: The key observation in the problem is that, If X, Y and Z are the valid sides of a triangle and X ≤ Y ≤ Z, then sufficient conditions for these sides to form a valid triangle will be X+Y > Z.Finally, the count of the possible Z value for the given X and Y can be computed as –  
If X+Y is greater than D, for this case Z can be chosen from [C, D], Total possible values of Z will be (D-C+1).If X+Y is less than D and greater than C, then Z can be chosen from [C, X+Y-1].If X+Y is less than or equal to C, then we cannot choose Z as these sides will not form a valid triangle.
If X+Y is greater than D, for this case Z can be chosen from [C, D], Total possible values of Z will be (D-C+1).
If X+Y is less than D and greater than C, then Z can be chosen from [C, X+Y-1].
If X+Y is less than or equal to C, then we cannot choose Z as these sides will not form a valid triangle.
Time Complexity: 
Efficient Approach: The idea is to iterate for all the possible values of A and then compute the number of possible Y and Z values possible for the given X using mathematical computations.For a given X, the value of X+Y will be in the range of . If we compute the number of possible value greater than D, then the total number of possible values of Y and Z will be –  
// Number of possible values of Y and Z
// If num_greater is the number of possible
// Y values which is greater than D

Similarly, Let R and L is the upper bound and Lower Bound of the values of X+Y in the range of C and D. Then, total combinations for Y and Z will be –  
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ implementation to count the// number of possible triangles// for the given sides ranges #include <bits/stdc++.h>using namespace std; // Function to count the number of// possible triangles for the given// sides rangesint count_triangles(int a, int b,                    int c, int d){     int ans = 0;     // Iterate for every possible of x    for (int x = a; x <= b; ++x) {         // Range of y is [b, c]        // From this range First        // we will find the number        // of x + y greater than d        int num_greater_than_d = max(d, c + x) - max(d, b + x - 1);         // For x+y greater than d        // we can choose all z from [c, d]        // Total permutation will be        ans += num_greater_than_d * (d - c + 1);         // Now we will find the number        // of x+y in between the [c, d]        int r = min(max(c, c + x), d) - c;        int l = min(max(c, b + x - 1), d) - c;         // [l, r] will be the range        // from total [c, d] x+y belongs        // For any r such that r = x+y        // We can choose z, in the range        // [c, d] only less than r,        // Thus total permutation be        int x1 = (r * (r + 1)) / 2;        int x2 = (l * (l + 1)) / 2;         ans += x1 - x2;    }     return ans;} // Driver Codeint main(){    int a = 2, b = 3, c = 4, d = 5;     cout << count_triangles(a, b, c, d)         << endl;     return 0;}
// Java implementation to count the// number of possible triangles// for the given sides rangesimport java.util.Scanner;import java.util.Arrays; class GFG{ // Function to count the number of// possible triangles for the given// sides rangespublic static int count_triangles(int a, int b,                                  int c, int d){    int ans = 0;     // Iterate for every possible of x    for(int x = a; x <= b; ++x)    {         // Range of y is [b, c]        // From this range First        // we will find the number        // of x + y greater than d        int num_greater_than_d = Math.max(d, c + x) -                                 Math.max(d, b + x - 1);         // For x+y greater than d        // we can choose all z from [c, d]        // Total permutation will be        ans += num_greater_than_d * (d - c + 1);         // Now we will find the number        // of x+y in between the [c, d]        int r = Math.min(Math.max(c, c + x), d) - c;        int l = Math.min(Math.max(c, b + x - 1), d) - c;         // [l, r] will be the range        // from total [c, d] x+y belongs        // For any r such that r = x+y        // We can choose z, in the range        // [c, d] only less than r,        // Thus total permutation be        int x1 = (r * (r + 1)) / 2;        int x2 = (l * (l + 1)) / 2;         ans += x1 - x2;    }    return ans;} // Driver Codepublic static void main(String args[]){    int a = 2, b = 3, c = 4, d = 5;     System.out.println(count_triangles(a, b, c, d));}} // This code is contributed by SoumikMondal
# Python3 implementation to count # the number of possible triangles# for the given sides ranges # Function to count the number of# possible triangles for the given# sides rangesdef count_triangles(a, b, c, d):     ans = 0     # Iterate for every possible of x    for x in range(a, b + 1):         # Range of y is [b, c]        # From this range First        # we will find the number        # of x + y greater than d        num_greater_than_d = (max(d, c + x) -                              max(d, b + x - 1))         # For x+y greater than d we        # can choose all z from [c, d]        # Total permutation will be        ans = (ans + num_greater_than_d *                             (d - c + 1))         # Now we will find the number        # of x+y in between the [c, d]        r = min(max(c, c + x), d) - c;        l = min(max(c, b + x - 1), d) - c;         # [l, r] will be the range        # from total [c, d] x+y belongs        # For any r such that r = x+y        # We can choose z, in the range        # [c, d] only less than r,        # Thus total permutation be        x1 = int((r * (r + 1)) / 2)        x2 = int((l * (l + 1)) / 2)         ans = ans + (x1 - x2)     return ans # Driver Codea = 2b = 3c = 4d = 5 print (count_triangles(a, b, c, d), end = '\n') # This code is contributed by PratikBasu    
// C# implementation to count the// number of possible triangles// for the given sides rangesusing System; class GFG{ // Function to count the number of// possible triangles for the given// sides rangespublic static int count_triangles(int a, int b,                                  int c, int d){    int ans = 0;     // Iterate for every possible of x    for(int x = a; x <= b; ++x)    {         // Range of y is [b, c]        // From this range First        // we will find the number        // of x + y greater than d        int num_greater_than_d = Math.Max(d, c + x) -                                 Math.Max(d, b + x - 1);         // For x+y greater than d        // we can choose all z from [c, d]        // Total permutation will be        ans += num_greater_than_d * (d - c + 1);         // Now we will find the number        // of x+y in between the [c, d]        int r = Math.Min(Math.Max(c, c + x), d) - c;        int l = Math.Min(Math.Max(c, b + x - 1), d) - c;         // [l, r] will be the range        // from total [c, d] x+y belongs        // For any r such that r = x+y        // We can choose z, in the range        // [c, d] only less than r,        // Thus total permutation be        int x1 = (r * (r + 1)) / 2;        int x2 = (l * (l + 1)) / 2;         ans += x1 - x2;    }    return ans;} // Driver Codepublic static void Main(String []args){    int a = 2, b = 3, c = 4, d = 5;     Console.WriteLine(count_triangles(a, b, c, d));}} // This code is contributed by gauravrajput1
<script> // JavaScript implementation to count the// number of possible triangles// for the given sides ranges // Function to count the number of// possible triangles for the given// sides rangesfunction count_triangles(a , b, c , d){    var ans = 0;     // Iterate for every possible of x    for(x = a; x <= b; ++x)    {         // Range of y is [b, c]        // From this range First        // we will find the number        // of x + y greater than d        var num_greater_than_d = Math.max(d, c + x) -                                 Math.max(d, b + x - 1);         // For x+y greater than d        // we can choose all z from [c, d]        // Total permutation will be        ans += num_greater_than_d * (d - c + 1);         // Now we will find the number        // of x+y in between the [c, d]        var r = Math.min(Math.max(c, c + x), d) - c;        var l = Math.min(Math.max(c, b + x - 1), d) - c;         // [l, r] will be the range        // from total [c, d] x+y belongs        // For any r such that r = x+y        // We can choose z, in the range        // [c, d] only less than r,        // Thus total permutation be        var x1 = (r * (r + 1)) / 2;        var x2 = (l * (l + 1)) / 2;         ans += x1 - x2;    }    return ans;} // Driver Code var a = 2, b = 3, c = 4, d = 5; document.write(count_triangles(a, b, c, d)); // This code contributed by shikhasingrajput </script>
7
 
PratikBasu
SoumikMondal
GauravRajput1
shikhasingrajput
triangle
Combinatorial
Competitive Programming
Geometric
Greedy
Mathematical
Greedy
Mathematical
Combinatorial
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Largest number by rearranging digits of a given positive or negative number
Johnson and Trotter algorithm
Ways to sum to N using Natural Numbers up to K with repetitions allowed
Combinations with repetitions
Given number of matches played, find number of teams in tournament
Practice for cracking any coding interview
Competitive Programming - A Complete Guide
Arrow operator -> in C/C++ with Examples
Bits manipulation (Important tactics)
Pairs with same Manhattan and Euclidean distance