给定一个由不同元素组成的数组A [] ,任务是要获得最大可能的模量值,该值在从给定数组的任何可能排列开始,从第一个元素开始,用它们的模量重复替换相邻元素后,剩下的模量值。
(…(( A[1] mod A[2]) mod A[3]) …. ) mod A[N])
例子:
Input: A[] = {7, 10, 12}
Output: 7
Explanation: All possible values of the given expression across all permutations of the given array are as follows:
{7, 10, 12} = ((7 % 10) % 12) = 7
{10, 12 7} = ((10 % 12) % 7) = 3
{7, 12, 10} =((7 % 12) % 10) = 7
{10, 7, 12} = ((10 % 7) % 12) = 3
{12, 7, 10} = ((12 % 7) % 10) = 5
{12, 10, 7} = ((12 % 10) % 7) = 2
Therefore, the maximum possible value is 7.
Input: A[] = {20, 30}
Output: 20
Explanation:
The maximum possible value from all the permutations of the given array is 20.
天真的方法:解决问题的最简单方法是生成给定数组的所有排列并找到所有排列的给定表达式的值。最后,打印获得的表达式的最大值。
时间复杂度: O(N * N!)
辅助空间: O(N)
高效方法:要优化上述方法,需要注意以下几点:
- For any permutation A1…..AN, the value of the expression always lies in the range [0, min(A2…..An)-1].
- Considering K to be the smallest element in the array, the value of the expression will always be K for the permutations having K as the first element.
- For all other permutations, the value of the expression will always be less than K, as shown in the examples above. Therefore, K is the maximum possible value of the expression for any permutation of the array.
- Therefore, the maximum possible value will always be equal to the smallest element of the array.
因此,要解决该问题,只需遍历数组并找到数组中存在的最小元素,然后将其打印为所需答案即可。
下面是上述方法的实现:
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
// Function to find the minimum
// of two numbers
int min(int a, int b)
{
return (a > b) ? b : a;
}
// Function to find the maximum value
// possible of the given expression
// from all permutations of the array
int maximumModuloValue(int A[], int n)
{
// Stores the minimum value
// from the array
int mn = INT_MAX;
for (int i = 0; i < n; i++) {
mn = min(A[i], mn);
}
// Return the answer
return mn;
}
// Driver Code
int main()
{
int A[] = { 7, 10, 12 };
int n = (sizeof(A) / (sizeof(A[0])));
cout << maximumModuloValue(A, n)
<< endl;
return 0;
}
Java
// Java Program to implement
// the above approach
import java.io.*;
class GFG{
// Function to find the maximum value
// possible of the given expression
// from all permutations of the array
static int maximumModuloValue(int A[], int n)
{
// Stores the minimum value
// from the array
int mn = Integer.MAX_VALUE;
for (int i = 0; i < n; i++)
{
mn = Math.min(A[i], mn);
}
// Return the answer
return mn;
}
// Driver Code
public static void main(String[] args)
{
int A[] = {7, 10, 12};
int n = A.length;
System.out.println(maximumModuloValue(A, n));
}
}
// This code is contributed by AnkitRai01
Python3
# Python3 program to implement
# the above approach
import sys
# Function to find the maximum value
# possible of the given expression
# from all permutations of the array
def maximumModuloValue(A, n):
# Stores the minimum value
# from the array
mn = sys.maxsize
for i in range(n):
mn = min(A[i], mn)
# Return the answer
return mn
# Driver Code
# Given array arr[]
A = [ 7, 10, 12 ]
n = len(A)
# Function call
print(maximumModuloValue(A, n))
# This code is contributed by Shivam Singh
C#
// C# Program to implement
// the above approach
using System;
class GFG{
// Function to find the maximum value
// possible of the given expression
// from all permutations of the array
static int maximumModuloValue(int []A,
int n)
{
// Stores the minimum value
// from the array
int mn = int.MaxValue;
for (int i = 0; i < n; i++)
{
mn = Math.Min(A[i], mn);
}
// Return the answer
return mn;
}
// Driver Code
public static void Main(String[] args)
{
int []A = {7, 10, 12};
int n = A.Length;
Console.WriteLine(maximumModuloValue(A, n));
}
}
// This code is contributed by shikhasingrajput
7
时间复杂度: O(N)
辅助空间: O(1)