给定N个线段,其中第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