📜  使用给定长度的线段可以制作的最大平行四边形数量

📅  最后修改于: 2021-04-29 11:03:23             🧑  作者: Mango

给定N个线段,其中第i个线段的长度为a_i 。任务是发现如果每个线段最多在一个平行四边形中使用,则可以使用这些线段制作最大数量的平行四边形。

例子:

Input: arr[] = {1, 2, 1, 2}
Output: 1
Only one parallelogram can be made with sides 1, 2, 1, 2

Input: arr[] = {1, 3, 5, 7, 1, 3, 5, 7, 1, 3, 5, 7}
Output: 2

方法:制作线段长度的频率阵列。然后,答案将是可以使用4个相似边制成的平行四边形的总数+可以使用2个相似边制成的平行四边形的总数。因为平行四边形必须具有相等的相对边。

C++
// Function to find the maximum number
// of parallelograms can be made
#include 
using namespace std;
  
void convert(int n, int a[])
{
  
    // Finding the length of the frequency array
    int z = a[0];
    for (int i = 1; i < n; i++) {
        if (a[i] > z)
            z = a[i];
    }
  
    z = z + 1;
  
    int ff[z] = { 0 };
    for (int i = 0; i < n; i++) {
        // Increasing the occurrence of each segment
        ff[a[i]] += 1;
    }
  
    // To store the count of parallelograms
    int cc = 0;
  
    for (int i = 0; i < z; i++) {
        // Counting parallelograms that can
        // be made using 4 similar sides
        cc += int(ff[i] / 4);
        ff[i] = ff[i] % 4;
    }
  
    int vv = 0;
  
    for (int i = 0; i < z; i++) {
        // counting segments which have occurrence left >= 2
        if (ff[i] >= 2)
            vv += 1;
    }
  
    // Adding parallelograms that can be
    // made using 2 similar sides
    cc += int(vv / 2);
    cout << (cc);
}
  
// Driver function
int main()
{
    int n = 4;
    int a[] = { 1, 2, 1, 2 };
    convert(n, a);
}
  
// This code is contributed by
// Surendra_Gangwar


Java
// Function to find the maximum number 
// of parallelograms can be made 
import java.util.*;
  
class GFG 
{
  
static void convert(int n, int a[]) 
{ 
  
    // Finding the length of the frequency array 
    int z = a[0]; 
    for (int i = 1; i < n; i++)
    { 
        if (a[i] > z) 
            z = a[i]; 
    } 
  
    z = z + 1; 
  
    int ff[] = new int[z]; 
    for (int i = 0; i < n; i++) 
    { 
        // Increasing the occurrence of each segment 
        ff[a[i]] += 1; 
    } 
  
    // To store the count of parallelograms 
    int cc = 0; 
  
    for (int i = 0; i < z; i++) 
    { 
        // Counting parallelograms that can 
        // be made using 4 similar sides 
        cc += (ff[i] / 4); 
        ff[i] = ff[i] % 4; 
    } 
  
    int vv = 0; 
  
    for (int i = 0; i < z; i++) 
    { 
        // counting segments which have occurrence left >= 2 
        if (ff[i] >= 2) 
            vv += 1; 
    } 
  
    // Adding parallelograms that can be 
    // made using 2 similar sides 
    cc += (vv / 2); 
    System.out.println(cc); 
} 
  
// Driver code 
public static void main(String[] args) 
{
    int n = 4; 
    int a[] = { 1, 2, 1, 2 }; 
    convert(n, a); 
}
}
  
/* This code is contributed by PrinciRaj1992 */


Python
# Function to find the maximum number 
# of parallelograms can be made
def convert(n, a):
  
    # Finding the length of the frequency array
    z = max(a)+1
  
    ff =[0]*z
    for i in range(n):
  
        # Increasing the occurrence of each segment
        ff[a[i]]+= 1
  
    # To store the count of parallelograms
    cc = 0
  
    for i in range(z):
        # Counting parallelograms that can 
        # be made using 4 similar sides
        cc+= ff[i]//4
        ff[i]= ff[i]% 4
  
    vv = 0
  
    for i in range(z):
        # counting segments which have occurrence left >= 2
        if(ff[i]>= 2):
            vv+= 1
  
    # Adding parallelograms that can be 
    # made using 2 similar sides
    cc+= vv//2
    print(cc)
  
      
n = 4
a =[1, 2, 1, 2]
convert(n, a)


C#
// Function to find the maximum number 
// of parallelograms can be made 
using System;
  
class GFG
{
      
static void convert(int n, int []a) 
{ 
  
    // Finding the length of the frequency array 
    int z = a[0]; 
    for (int i = 1; i < n; i++)
    { 
        if (a[i] > z) 
            z = a[i]; 
    } 
  
    z = z + 1; 
  
    int []ff = new int[z]; 
    for (int i = 0; i < n; i++) 
    { 
        // Increasing the occurrence of each segment 
        ff[a[i]] += 1; 
    } 
  
    // To store the count of parallelograms 
    int cc = 0; 
  
    for (int i = 0; i < z; i++) 
    { 
        // Counting parallelograms that can 
        // be made using 4 similar sides 
        cc += (ff[i] / 4); 
        ff[i] = ff[i] % 4; 
    } 
  
    int vv = 0; 
  
    for (int i = 0; i < z; i++) 
    { 
        // counting segments which have occurrence left >= 2 
        if (ff[i] >= 2) 
            vv += 1; 
    } 
  
    // Adding parallelograms that can be 
    // made using 2 similar sides 
    cc += (vv / 2); 
Console.WriteLine(cc); 
} 
  
// Driver code 
static public void Main ()
{
          
    int n = 4; 
    int []a = { 1, 2, 1, 2 }; 
    convert(n, a); 
}
}
  
/* This code is contributed by ajit_23*/


输出:
1