在C ++中使用给定的线段长度可以制作的最大平行四边形数量
给定任务是,如果每个线段最多可以在一个平行四边形中使用,则查找使用给定N个线段可以制作的平行四边形的最大数量。
现在让我们使用示例了解我们必须做的事情-
输入−Arr[]={8,3,1,3,8,7,1,1,3,5,3}
输出-2
解释-使用上述给定的线段,可以形成的两个平行四边形分别具有边8、1、8、1和3、3、3、3。
输入-Arr[]={7,9,9,7}
输出-1
在以下程序中使用的方法如下
可以制作的平行四边形的最大数量为=可以用4个相等或相似的侧面制作的平行四边形,再加上可以使用2个相似的侧面制作的平行四边形。
在函数中MaxParr()
,初始化变量L=Arr[0],该变量将用作数组的大小,该数组将用于存储线段的频率。
从i=1循环直到i<N并检查(Arr[i]>L),然后在if语句中放入L=Arr[i]。在循环外部,将L的大小增加1。
然后初始化频率数组intFreq[L]={0}。从i=0循环直到i<N,并将每个分段的出现次数增加1。
int类型的初始化计数=0,用于存储平行四边形的最终计数。
从i=0循环直到i<L,并检查可以用4个相似边制成的平行四边形,如果找到,则相应地增加count的值。
初始化类型为int的left=0以存储可以使用2个相似边形成的平行四边形的数量。
最后从i=0循环直到i<L,然后检查if(Freq[i]>=2),如果是,则在左边加1。
将count+=left/2并返回count。
示例
#include <bits/stdc++.h> using namespace std; int MaxParr(int N, int Arr[]){ //查找频率数组的长度 int L = Arr[0]; for (int i = 1; i < N; i++){ if (Arr[i] > L) L = Arr[i]; } L = L + 1; int Freq[L] = {0}; for (int i = 0; i < N; i++){ //每个线段的出现次数增加 Freq[Arr[i]] += 1; } //要存储平行四边形的数量 int count = 0; for (int i = 0; i < L; i++){ /*parallelograms that can be made using 4 same sides*/ count += int(Freq[i] / 4); Freq[i] = Freq[i] % 4; } int left = 0; for (int i = 0; i < L; i++){ //计算剩余2个或更多事件的细分 if (Freq[i] >= 2) left += 1; } /*Adding parallelograms that can be formed using using 2 similar sides into the final count*/ count += left / 2; return count; } int main(){ int N = 10; int Arr[] = { 8, 3, 1, 3, 8, 7, 1, 3, 5, 3}; cout<< MaxParr(N, Arr); }
输出结果
如果运行上面的代码,我们将获得以下输出-
2