通过重复减法使所有元素相同后找到最大数组和
给定一个包含n 个元素的数组,找出所有元素的最大可能和,使得所有元素都相等。唯一允许的操作是选择任意两个元素并将其中较大的一个替换为两者的绝对差。
例子:
Input : 9 12 3 6
Output : 12
Explanation :
9 12 3 6
replace a2 = 12 with a2-a4 = 12 - 6 => 6
i.e, 9 6 3 6
replace a4 = 6 with a4-a3 = 6 - 3 => 3
i.e, 9 6 3 3
replace a1 = 9 with a1-a2 = 9 - 6 => 3
i.e, 3 6 3 3
replace a2 = 6 with a2-a4 = 6 - 3 => 3
i,e. 3 3 3 3
Now, at this point we have all the elements equal,
hence we can return our answer from here.
Input : 4 8 6 10
Output : 8
Explanation :
Resultant array formed will be:
4 8 6 10
replace a4 = 10 with a4-a1 = 10 - 4 => 6
i.e, 4 8 6 6
replace a3 = 6 with a3-a1 = 6 - 4 => 2
i.e, 4 8 2 6
replace a2 = 8 with a2-a4 = 8 - 6 => 2
i.e, 4 2 2 6
replace a4 = 6 with a4-a1 = 6 - 4 => 2
i,e. 4 2 2 2
replace a1 = 4 with a1-a2 = 4 - 2 => 2
i,e. 2 2 2 2
Now, at this point we have all the elements equal,
hence we can return our answer from here.
通过分析给定的操作,即
ai = ai - aj where ai > aj
我们看到这类似于通过欧几里得算法找到 GCD:
GCD(a, b) = GCD(b, a - b)
而且,重排的顺序无关紧要,我们可以取任意两个元素,用两者的绝对差值代替较大的值,然后在它们之间重复直到差值为零[两个元素都相同]。即取出任意两个数的GCD。这样做的原因是,GCD 是关联的和可交换的。
所以想法是一次获取所有元素的 GCD 并用该结果替换所有元素。
C++
// Maximum possible sum of array after repeated
// subtraction operation.
#include
using namespace std;
int GCD(int a, int b)
{
if (b == 0)
return a;
return GCD(b, a % b);
}
int findMaxSumUtil(int arr[], int n)
{
int finalGCD = arr[0];
for (int i = 1; i < n; i++)
finalGCD = GCD(arr[i], finalGCD);
return finalGCD;
}
// This function basically calls findMaxSumUtil()
// to find GCD of all array elements, then it returns
// GCD * (Size of array)
int findMaxSum(int arr[], int n)
{
int maxElement = findMaxSumUtil(arr, n);
return (maxElement * n);
}
// Driver code
int main()
{
int arr[] = {8, 20, 12, 36};
int n = sizeof(arr)/sizeof(arr[0]);
cout << findMaxSum(arr, n) << endl;
return 0;
}
Java
// Maximum possible sum of array after repeated
// subtraction operation.
import java.io.*;
class GFG {
static int GCD(int a, int b)
{
if (b == 0)
return a;
return GCD(b, a % b);
}
static int findMaxSumUtil(int arr[], int n)
{
int finalGCD = arr[0];
for (int i = 1; i < n; i++)
finalGCD = GCD(arr[i], finalGCD);
return finalGCD;
}
// This function basically calls
// findMaxSumUtil() to find GCD of all
// array elements, then it returns
// GCD * (Size of array)
static int findMaxSum(int arr[], int n)
{
int maxElement = findMaxSumUtil(arr, n);
return (maxElement * n);
}
// Driver code
public static void main (String[] args) {
int arr[] = {8, 20, 12, 36};
int n = arr.length;
System.out.println(findMaxSum(arr, n));
}
}
//This code is contributed by vt_m.
Python3
# Maximum possible sum of array after
# repeated subtraction operation.
def GCD(a, b):
if (b == 0): return a
return GCD(b, a % b)
def findMaxSumUtil(arr, n):
finalGCD = arr[0]
for i in range(1, n):
finalGCD = GCD(arr[i], finalGCD)
return finalGCD
# This function basically calls
# findMaxSumUtil() to find GCD of
# all array elements, then it returns
# GCD * (Size of array)
def findMaxSum(arr, n):
maxElement = findMaxSumUtil(arr, n)
return (maxElement * n)
# Driver code
arr = [8, 20, 12, 36]
n = len(arr)
print(findMaxSum(arr, n))
# This code is contributed by Anant Agarwal.
C#
// C# Code for Maximum possible sum of array
// after repeated subtraction operation.
using System;
class GFG {
static int GCD(int a, int b)
{
if (b == 0)
return a;
return GCD(b, a % b);
}
static int findMaxSumUtil(int []arr, int n)
{
int finalGCD = arr[0];
for (int i = 1; i < n; i++)
finalGCD = GCD(arr[i], finalGCD);
return finalGCD;
}
// This function basically calls
// findMaxSumUtil() to find GCD of all
// array elements, then it returns
// GCD * (Size of array)
static int findMaxSum(int []arr, int n)
{
int maxElement = findMaxSumUtil(arr, n);
return (maxElement * n);
}
// Driver code
public static void Main () {
int []arr = {8, 20, 12, 36};
int n = arr.Length;
Console.WriteLine(findMaxSum(arr, n));
}
}
// This code is contributed by vt_m.
PHP
Javascript
输出:
16