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

📅  最后修改于: 2021-10-26 05:54:55             🧑  作者: 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*/


Javascript


输出:
1

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程