Entero positivo más pequeño que divide todos los elementos de la array para generar cocientes cuya suma no exceda K

Dada una array arr[] de tamaño N y un entero positivo K , la tarea es encontrar el entero positivo más pequeño tal que la suma de los elementos restantes de la array obtenidos al dividir todos los elementos de la array por ese entero positivo más pequeño no exceda K

Nota: La división de un elemento de array por el entero positivo más pequeño debe ser del tipo Ceil .

Ejemplos:

Entrada: arr[] = {1, 2, 5, 9}, K = 6 
Salida:
Explicación: 
Dividir todos los elementos de la array por 5 modifica arr[] a {1, 1, 1, 2}. 
Dado que la suma de los elementos del arreglo es igual a 5 (< K), la salida requerida es 5. 

Entrada: arr[]= {2, 3, 5, 7, 11}, K = 11 
Salida:
 

Enfoque ingenuo: el enfoque más simple para resolver este problema es encontrar el elemento más grande en la array , digamos Max , e iterar sobre el rango [1, Max] usando la variable i y verificar si la suma de los elementos restantes de la array después de dividir todo los elementos de la array por i son menores o iguales a K o no. Si se encuentra que es cierto, imprima i

Complejidad de tiempo: O(N * Max), donde Max es el elemento más grande de la array.  
Espacio Auxiliar: O(1)

Enfoque eficiente: para optimizar el enfoque anterior, la idea es utilizar la técnica de búsqueda binaria . Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos Max , para almacenar el elemento más grande presente en la array .
  • El valor del entero positivo más pequeño que divide todos los elementos de la array para obtener la suma de los elementos de la array restantes menores o iguales a K debe estar en el rango [1, Max] . Por lo tanto, aplique la búsqueda binaria en el rango [1, Max] .
  • Inicialice dos variables, digamos left = 1 y right = Max , para almacenar el rango en el que se encuentra el valor de la salida requerida.
  • Compruebe si es posible obtener la suma de los elementos de la array menor o igual a K dividiendo los elementos de la array por (izquierda + derecha) / 2 o no. Si se determina que es cierto, actualice right = (left + right) / 2 .
  • De lo contrario, actualice left = (left + right) /2 .
  • Finalmente, imprima el valor de left .

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the smallest positive integer
// that divides array elements to get the sum <= K
int findSmallestInteger(int arr[], int N, int K)
{
 
    // Stores minimum possible of the smallest
    // positive integer satisfying the condition
    int left = 1;
 
    // Stores maximum possible of the smallest
    // positive integer satisfying the condition
    int right = *max_element(arr, arr + N);
 
    // Apply binary search over
    // the range [left, right]
    while (left < right) {
 
        // Stores middle element
        // of left and right
        int mid = (left + right) / 2;
 
        // Stores sum of
        // array elements
        int sum = 0;
 
        // Traverse the array
        for (int i = 0; i < N; i++) {
 
            // Update sum
            sum += (arr[i] + mid - 1) / mid;
        }
 
        // If sum is greater than K
        if (sum > K) {
 
            // Update left
            left = mid + 1;
        }
        else {
 
            // Update right
            right = mid;
        }
    }
    return left;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 2, 5, 9 };
    int N = sizeof(arr) / sizeof(arr[0]);
    ;
    int K = 6;
    cout << findSmallestInteger(arr, N, K);
}

Java

// Java program to implement
// the above approach
import java.util.*;
  
class GFG{
      
// Function to find the smallest positive integer
// that divides array elements to get the sum <= K
static int findSmallestInteger(int arr[],
                               int N, int K)
{
     
    // Stores minimum possible of the smallest
    // positive integer satisfying the condition
    int left = 1;
  
    // Stores maximum possible of the smallest
    // positive integer satisfying the condition
    int right = Arrays.stream(arr).max().getAsInt();
  
    // Apply binary search over
    // the range [left, right]
    while (left < right)
    {
         
        // Stores middle element
        // of left and right
        int mid = (left + right) / 2;
  
        // Stores sum of
        // array elements
        int sum = 0;
  
        // Traverse the array
        for(int i = 0; i < N; i++)
        {
             
            // Update sum
            sum += (arr[i] + mid - 1) / mid;
        }
  
        // If sum is greater than K
        if (sum > K)
        {
             
            // Update left
            left = mid + 1;
        }
        else
        {
             
            // Update right
            right = mid;
        }
    }
    return left;
}
  
// Driver code
public static void main(String[] args)
{
    int[] arr = { 1, 2, 5, 9 };
    int N = arr.length;
    int K = 6;
     
    System.out.println(findSmallestInteger(arr, N, K));
}
}
 
// This code is contributed by susmitakundugoaldanga

Python3

# Python3 program to implement
# the above approach
 
# Function to find the smallest positive integer
# that divides array elements to get the sum <= K
def findSmallestInteger(arr, N, K):
 
    # Stores minimum possible of the smallest
    # positive integer satisfying the condition
    left = 1
 
    # Stores maximum possible of the smallest
    # positive integer satisfying the condition
    right = max(arr)
 
    # Apply binary search over
    # the range [left, right]
    while (left < right):
 
        # Stores middle element
        # of left and right
        mid = (left + right) // 2
 
        # Stores sum of
        # array elements
        sum = 0
 
        # Traverse the array
        for i in range(N):
 
            # Update sum
            sum += (arr[i] + mid - 1) // mid
 
        # If sum is greater than K
        if (sum > K):
 
            # Update left
            left = mid + 1
 
        else:
 
            # Update right
            right = mid
 
    return left
 
# Driver Code
if __name__ == '__main__':
    arr = [1, 2, 5, 9]
    N = len(arr)
 
    K = 6
    print(findSmallestInteger(arr, N, K))
 
# This code is contributed by mohit kumar 29

C#

// C# program to implement
// the above approach 
using System;
using System.Linq; 
 
class GFG{
      
// Function to find the smallest positive integer
// that divides array elements to get the sum <= K
static int findSmallestInteger(int[] arr,
                               int N, int K)
{
      
    // Stores minimum possible of the smallest
    // positive integer satisfying the condition
    int left = 1;
   
    // Stores maximum possible of the smallest
    // positive integer satisfying the condition
    int right = arr.Max();
   
    // Apply binary search over
    // the range [left, right]
    while (left < right)
    {
          
        // Stores middle element
        // of left and right
        int mid = (left + right) / 2;
   
        // Stores sum of
        // array elements
        int sum = 0;
   
        // Traverse the array
        for(int i = 0; i < N; i++)
        {
              
            // Update sum
            sum += (arr[i] + mid - 1) / mid;
        }
   
        // If sum is greater than K
        if (sum > K)
        {
              
            // Update left
            left = mid + 1;
        }
        else
        {
              
            // Update right
            right = mid;
        }
    }
    return left;
}
  
// Driver Code
public static void Main()
{
    int[] arr = { 1, 2, 5, 9 };
    int N = arr.Length;
    int K = 6;
      
    Console.Write(findSmallestInteger(arr, N, K));
}
}
 
// This code is contributed by sanjoy_62

Javascript

<script>
 
// Javascript program to implement
// the above approach
 
// Function to find the smallest positive integer
// that divides array elements to get the sum <= K
function findSmallestInteger(arr, N, K)
{
     
    // Stores minimum possible of the smallest
    // positive integer satisfying the condition
    var left = 1;
 
    // Stores maximum possible of the smallest
    // positive integer satisfying the condition
    var right = arr.reduce((a, b) => Math.max(a, b));
 
    // Apply binary search over
    // the range [left, right]
    while (left < right)
    {
         
        // Stores middle element
        // of left and right
        var mid = (left + right) / 2;
 
        // Stores sum of
        // array elements
        var sum = 0;
 
        // Traverse the array
        for(var i = 0; i < N; i++)
        {
             
            // Update sum
            sum += parseInt((arr[i] + mid - 1) / mid);
        }
 
        // If sum is greater than K
        if (sum > K)
        {
             
            // Update left
            left = mid + 1;
        }
        else
        {
             
            // Update right
            right = mid;
        }
    }
    return left;
}
 
// Driver Code
var arr = [ 1, 2, 5, 9 ];
var N = arr.length;
var K = 6;
 
document.write(findSmallestInteger(arr, N, K));
 
// This code is contributed by importantly
 
</script>
Producción: 

5

 

Complejidad de tiempo: O(N * log(Max)), donde Max es el elemento más grande de la array.  
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por rohit2sahu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *