给定一个由N个元素组成的数组arr [] ,任务是找到在给定数组上需要执行的最小增量数,以便在选择任意索引处的任何数组元素并将其值拆分为其他数组元素后,所有其他N – 1个元素相等。
例子:
Input: N = 3, arr[] = {2, 3, 7}
Output: 2
Explanation:
Incrementing arr[0] and arr[1] by 1 modifies arr[] to {3, 4, 7}.
Removing arr[0] and adding to arr[1] makes the array {7, 7}.
Removing arr[1] and adding to arr[0] makes the array {7, 7}
Removing arr[2] and adding 3 to arr[1] and 4 to arr[0] makes the array {7, 7}.
Therefore, the count of increments required is 2.
Input: N = 3, arr[] = {0, 2, 0}
Output: 2
方法:按照以下步骤解决问题:
- 找到给定数组元素的和与该数组中存在的最大元素的总和,并将其存储在变量中,例如sum和maxelement 。
- 所有剩余的N – 1个元素必须等于ceil(sum / N-1) 。将该值设为K。
- 由于元素只能增加1 ,因此如果maxelement大于K ,则将K设置为maxelement 。
- 现在,每个N – 1值应等于K。因此,最终的总和应为K *(N-1) 。
- 因此,所需的移动总数为K *(N – 1)– sum 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to count minimum moves
void minimumMoves(int arr[], int N)
{
// Stores sum of given array
int sum = 0;
// Stores maximum array element
int maxelement = -1;
// Base Case
if (N == 2) {
// If N is 2, the answer
// will always be 0
cout << 0;
}
// Traverse the array
for (int i = 0; i < N; i++) {
// Calculate sum of the array
sum += arr[i];
// Finding maximum element
maxelement = max(maxelement, arr[i]);
}
// Calculate ceil(sum/N-1)
int K = (sum + N - 2) / (N - 1);
// If k is smaller than maxelement
K = max(maxelement, K);
// Final sum - original sum
int ans = K * (N - 1) - sum;
// Print the minimum number
// of increments required
cout << ans;
}
// Driver Code
int main()
{
// Given array
int arr[] = { 2, 3, 7 };
// Size of given array
int N = 3;
// Function Call
minimumMoves(arr, N);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG {
// Function to find the minimum moves
public static void minimumMoves(
int[] arr, int N)
{
// Stores the sum of the array
int sum = 0;
// Store the maximum element
int maxelement = -1;
// Base Case
if (N == 2) {
// If N is 2, the answer
// will always be 0
System.out.print("0");
return;
}
// Traverse the array
for (int i = 0; i < N; i++) {
// Calculate sum of the array
sum += arr[i];
// Finding maximum element
maxelement = Math.max(
maxelement, arr[i]);
}
// Calculate ceil(sum/N-1)
int k = (sum + N - 2) / (N - 1);
// If k is smaller than maxelement
k = Math.max(maxelement, k);
// Final sum - original sum
int ans = k * (N - 1) - sum;
// Print the minimum number
// of increments required
System.out.println(ans);
}
// Driver Code
public static void main(String[] args)
{
// Given array
int[] arr = { 2, 3, 7 };
// Size of given array
int N = arr.length;
// Function Call
minimumMoves(arr, N);
}
}
Python3
# Python3 program for the above approach
# Function to count minimum moves
def minimumMoves(arr, N):
# Stores sum of given array
sum = 0
# Stores maximum array element
maxelement = -1
# Base Case
if (N == 2):
# If N is 2, the answer
# will always be 0
print(0, end = "")
# Traverse the array
for i in range(N):
# Calculate sum of the array
sum += arr[i]
# Finding maximum element
maxelement = max(maxelement, arr[i])
# Calculate ceil(sum/N-1)
K = (sum + N - 2) // (N - 1)
# If k is smaller than maxelement
K = max(maxelement, K)
# Final sum - original sum
ans = K * (N - 1) - sum
# Print the minimum number
# of increments required
print(ans)
# Driver Code
if __name__ == '__main__':
# Given array
arr = [ 2, 3, 7 ]
# Size of given array
N = 3
# Function Call
minimumMoves(arr, N)
# This code is contributed by mohit kumar 29
C#
// C# program for the above approach
using System;
class GFG
{
// Function to find the minimum moves
static void minimumMoves(int[] arr, int N)
{
// Stores the sum of the array
int sum = 0;
// Store the maximum element
int maxelement = -1;
// Base Case
if (N == 2)
{
// If N is 2, the answer
// will always be 0
Console.Write("0");
return;
}
// Traverse the array
for (int i = 0; i < N; i++)
{
// Calculate sum of the array
sum += arr[i];
// Finding maximum element
maxelement = Math.Max(
maxelement, arr[i]);
}
// Calculate ceil(sum/N-1)
int k = (sum + N - 2) / (N - 1);
// If k is smaller than maxelement
k = Math.Max(maxelement, k);
// Final sum - original sum
int ans = k * (N - 1) - sum;
// Print the minimum number
// of increments required
Console.WriteLine(ans);
}
// Driver code
static void Main()
{
// Given array
int[] arr = { 2, 3, 7 };
// Size of given array
int N = arr.Length;
// Function Call
minimumMoves(arr, N);
}
}
// This code is contributed by divyesh072019.
输出:
2
时间复杂度: O(N)
辅助空间: O(N)