给定一个由N 个整数组成的数组 arr[] ,代表木棍的长度,任务是找到使用这些木棍构造的正方形和矩形的所有长度的最大可能总和。
注意单边可以只用一根棍子表示。
例子:
Input: arr[] = {5, 3, 2, 3, 6, 3, 3}
Output: 12
Sum of length of Squares= 3 * 4 = 12
Sum of length of Rectangles = 0
Input: arr[] = {5, 3, 2, 3, 6, 4, 4, 4, 5, 5, 5 }
Output: 34
Sum of length of Squares = 5 * 4 = 20
Sum of length of Rectangles = 3 * 2 + 4 * 2 = 34
处理方法:按照以下步骤解决问题:
- 遍历数组以计算所有数组元素的频率,例如 freq 。
- 计数至少为2 的频率。
- 将频率转换为最接近的较小偶数值。
- 按降序将频率转换为一维数组。
- 现在,将元素相加到 4 的倍数的索引。
- 打印所有这些元素的总和
下面是上述方法的实现:
C++14
#include
using namespace std;
// Function to find the maximum of sum
// of lengths of rectangles and squares
// formed using given set of sticks
void findSumLength(vector arr,int n)
{
// Stores the count of frequencies
// of all the array elements
map freq;
for(int i:arr) freq[i] += 1;
// Stores frequencies which are at least 2
map freq_2;
for (auto i:freq)
{
if (freq[i.first] >= 2)
freq_2[i.first] = freq[i.first];
}
// Convert all frequencies to nearest
// smaller even values.
vector arr1;
for (auto i:freq_2)
arr1.push_back((i.first) * (freq_2[(i.first)]/2)*2);
sort(arr1.begin(), arr1.end());
// Sum of elements up to
// index of multiples of 4
int summ = 0;
for (int i:arr1)
summ += i;
// Print the sum
cout << summ;
}
// Driver Code
int main()
{
vector arr = {5, 3, 2, 3, 6, 4, 4, 4, 5, 5, 5};
int n = arr.size();
findSumLength(arr, n);
return 0;
}
// This code is contributed by mohit kumar 29.
Python3
# Python3 implementation of
# the above approach
from collections import Counter
# Function to find the maximum of sum
# of lengths of rectangles and squares
# formed using given set of sticks
def findSumLength(arr, n) :
# Stores the count of frequencies
# of all the array elements
freq = dict(Counter(arr))
# Stores frequencies which are at least 2
freq_2 = {}
for i in freq:
if freq[i]>= 2:
freq_2[i] = freq[i]
# Convert all frequencies to nearest
# smaller even values.
arr1 = []
for i in freq_2:
arr1.extend([i]*(freq_2[i]//2)*2)
# Sort the array in descending order
arr1.sort(reverse = True)
# Sum of elements up to
# index of multiples of 4
summ = 0
for i in range((len(arr1)//4)*4):
summ+= arr1[i]
# Print the sum
print(summ)
# Driver Code
if __name__ == "__main__" :
arr = [5, 3, 2, 3, 6, 4, 4, 4, 5, 5, 5];
n = len(arr);
findSumLength(arr, n);
C#
using System;
using System.Collections.Generic;
class GFG{
// Function to find the maximum of sum
// of lengths of rectangles and squares
// formed using given set of sticks
static void findSumLength(List arr, int n)
{
// Stores the count of frequencies
// of all the array elements
Dictionary freq = new Dictionary();
foreach (int i in arr){
if(freq.ContainsKey(i))
freq[i] += 1;
else
freq[i] = 1;
}
// Stores frequencies which are at least 2
Dictionary freq_2 = new Dictionary();
foreach(KeyValuePair entry in freq)
{
if (freq[entry.Key] >= 2)
freq_2[entry.Key] = freq[entry.Key];
}
// Convert all frequencies to nearest
// smaller even values.
List arr1 = new List();
foreach(KeyValuePair entry in freq_2)
arr1.Add(entry.Key * (freq_2[entry.Key]/2)*2);
arr1.Sort();
// Sum of elements up to
// index of multiples of 4
int summ = 0;
foreach (int i in arr1){
summ += i;
}
// Print the sum
Console.WriteLine(summ);
}
// Driver Code
public static void Main()
{
List arr = new List(){5, 3, 2, 3, 6, 4, 4, 4, 5, 5, 5};
int n = arr.Count;
findSumLength(arr, n);
}
}
// THIS CODE IS CONTRIBUTED BY SURENDRA_GANGWAR.
Javascript
输出:
34
时间复杂度: O(NlogN)
辅助空间: O(1)