Cuente las formas de seleccionar elementos de array K que se encuentran en un rango determinado

Dados tres enteros positivos, L , R , K y un arreglo arr[] que consta de N enteros positivos, la tarea es contar el número de formas de seleccionar al menos K elementos del arreglo que tengan valores en el rango [L, R] .

Ejemplos:

Entrada: arr[] = {12, 4, 6, 13, 5, 10}, K = 3, L = 4, R = 10 
Salida:
Explicación: 
formas posibles de seleccionar al menos K(= 3) elementos de array que tengan los valores en el rango [4, 10] son: { (arr[1], arr[2], arr[4]), (arr[1], arr[2], arr[5]), (arr[1 ], salida[4], salida[5]), (salida[2], salida[4], salida[5]), (salida[1], salida[2], salida[4], salida[5] ) } 
Por lo tanto, la salida requerida es 5.

Entrada: arr[] = {1, 2, 3, 4, 5}, K = 4, L = 1, R = 5 
Salida:
 

 

Enfoque: siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos cntWays , para almacenar el recuento de formas de seleccionar al menos K elementos de array que tengan valores en el rango [L, R] .
  • Inicialice una variable, diga cntNum para almacenar el recuento de números en la array dada cuyos valores se encuentran en el rango rango dado.
  • Finalmente, imprima la suma de todos los valores posibles de  {cntNum\choose k + i}        tal que (K + i) sea menor o igual que cntNum .

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 calculate factorial
// of all the numbers up to N
vector<int> calculateFactorial(int N)
{
    vector<int> fact(N + 1);
 
    // Factorial of 0 is 1
    fact[0] = 1;
 
    // Calculate factorial of
    // all the numbers upto N
    for (int i = 1; i <= N; i++) {
 
        // Calculate factorial of i
        fact[i] = fact[i - 1] * i;
    }
 
    return fact;
}
 
// Function to find the count of ways to select
// at least K elements whose values in range [L, R]
int cntWaysSelection(int arr[], int N, int K,
                     int L, int R)
{
 
    // Stores count of ways to select at least
    // K elements whose values in range [L, R]
    int cntWays = 0;
 
    // Stores count of numbers having
    // value lies in the range [L, R]
    int cntNum = 0;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Checks if the array elements
        // lie in the given range
        if (arr[i] >= L && arr[i] <= R) {
 
            // Update cntNum
            cntNum++;
        }
    }
 
    // Stores factorial of numbers upto N
    vector<int> fact
        = calculateFactorial(cntNum);
 
    // Calculate total ways to select at least
    // K elements whose values lies in [L, R]
    for (int i = K; i <= cntNum; i++) {
 
        // Update cntWays
        cntWays += fact[cntNum] / (fact[i]
                                   * fact[cntNum - i]);
    }
 
    return cntWays;
}
 
// Driver Code
int main()
{
    int arr[] = { 12, 4, 6, 13, 5, 10 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 3;
    int L = 4;
    int R = 10;
 
    cout << cntWaysSelection(arr, N, K, L, R);
}

Java

// Java program to implement
// the above approach
class GFG{
 
// Function to calculate factorial
// of all the numbers up to N
static int[] calculateFactorial(int N)
{
    int []fact = new int[N + 1];
 
    // Factorial of 0 is 1
    fact[0] = 1;
 
    // Calculate factorial of
    // all the numbers upto N
    for (int i = 1; i <= N; i++) {
 
        // Calculate factorial of i
        fact[i] = fact[i - 1] * i;
    }
 
    return fact;
}
 
// Function to find the count of ways to select
// at least K elements whose values in range [L, R]
static int cntWaysSelection(int arr[], int N, int K,
                     int L, int R)
{
 
    // Stores count of ways to select at least
    // K elements whose values in range [L, R]
    int cntWays = 0;
 
    // Stores count of numbers having
    // value lies in the range [L, R]
    int cntNum = 0;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Checks if the array elements
        // lie in the given range
        if (arr[i] >= L && arr[i] <= R) {
 
            // Update cntNum
            cntNum++;
        }
    }
 
    // Stores factorial of numbers upto N
    int []fact
        = calculateFactorial(cntNum);
 
    // Calculate total ways to select at least
    // K elements whose values lies in [L, R]
    for (int i = K; i <= cntNum; i++) {
 
        // Update cntWays
        cntWays += fact[cntNum] / (fact[i]
                                   * fact[cntNum - i]);
    }
 
    return cntWays;
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 12, 4, 6, 13, 5, 10 };
    int N = arr.length;
    int K = 3;
    int L = 4;
    int R = 10;
 
    System.out.print(cntWaysSelection(arr, N, K, L, R));
}
}
 
// This code is contributed by Amit Katiyar

Python3

# Python3 program to implement the
# above approach
 
# Function to calculate factorial
# of all the numbers up to N
def calculateFactorial(N):
 
    fact = [0] * (N + 1)
 
    # Factorial of 0 is 1
    fact[0] = 1
 
    # Calculate factorial of all
    # the numbers upto N
    for i in range(1, N + 1):
 
        # Calculate factorial of i
        fact[i] = fact[i - 1] * i
         
    return fact
 
# Function to find count of ways to select
# at least K elements whose values in range[L,R]
def cntWaysSelection(arr, N, K, L, R):
     
    # Stores count of ways to select at leas
    # K elements whose values in range[L,R]
    cntWays = 0
 
    # Stores count of numbers having
    # Value lies in the range[L,R]
    cntNum = 0
 
    # Traverse the array
    for i in range(0, N):
         
        # Check if the array elements
        # Lie in the given range
        if (arr[i] >= L and arr[i] <= R):
             
            # Update cntNum
            cntNum += 1
 
    # Stores factorial of numbers upto N
    fact = list(calculateFactorial(cntNum))
 
    # Calculate total ways to select at least
    # K elements whose values Lies in [L,R]
    for i in range(K, cntNum + 1):
         
        # Update cntWays
        cntWays += fact[cntNum] // (fact[i] *
                                    fact[cntNum - i])
                                     
    return cntWays
 
# Driver code
if __name__ == "__main__":
     
    arr = [ 12, 4, 6, 13, 5, 10 ]
    N = len(arr)
    K = 3
    L = 4
    R = 10
     
    print(cntWaysSelection(arr, N, K, L, R))
 
# This code is contributed by Virusbuddah

C#

// C# program to implement
// the above approach
using System;
  
class GFG{
  
// Function to calculate factorial
// of all the numbers up to N
static int[] calculateFactorial(int N)
{
    int[] fact = new int[(N + 1)];
     
    // Factorial of 0 is 1
    fact[0] = 1;
     
    // Calculate factorial of
    // all the numbers upto N
    for(int i = 1; i <= N; i++)
    {
         
        // Calculate factorial of i
        fact[i] = fact[i - 1] * i;
    }
    return fact;
}
  
// Function to find the count of ways to select
// at least K elements whose values in range [L, R]
static int cntWaysSelection(int[] arr, int N, int K,
                            int L, int R)
{
     
    // Stores count of ways to select at least
    // K elements whose values in range [L, R]
    int cntWays = 0;
     
    // Stores count of numbers having
    // value lies in the range [L, R]
    int cntNum = 0;
     
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
         
        // Checks if the array elements
        // lie in the given range
        if (arr[i] >= L && arr[i] <= R)
        {
             
            // Update cntNum
            cntNum++;
        }
    }
  
    // Stores factorial of numbers upto N
    int[] fact = calculateFactorial(cntNum);
  
    // Calculate total ways to select at least
    // K elements whose values lies in [L, R]
    for(int i = K; i <= cntNum; i++)
    {
         
        // Update cntWays
        cntWays += fact[cntNum] / (fact[i] *
                   fact[cntNum - i]);
    }
    return cntWays;
}
  
// Driver Code
public static void Main()
{
    int[] arr = { 12, 4, 6, 13, 5, 10 };
    int N = arr.Length;
    int K = 3;
    int L = 4;
    int R = 10;
     
    Console.WriteLine(cntWaysSelection(
        arr, N, K, L, R));
}
}
 
// This code is contributed by code_hunt

Javascript

<script>
 
// Javascript program to implement
// the above approach
 
// Function to calculate factorial
// of all the numbers up to N
function calculateFactorial(N)
{
    var fact = Array(N + 1);
 
    // Factorial of 0 is 1
    fact[0] = 1;
 
    // Calculate factorial of
    // all the numbers upto N
    for (var i = 1; i <= N; i++) {
 
        // Calculate factorial of i
        fact[i] = fact[i - 1] * i;
    }
 
    return fact;
}
 
// Function to find the count of ways to select
// at least K elements whose values in range [L, R]
function cntWaysSelection(arr, N, K, L, R)
{
 
    // Stores count of ways to select at least
    // K elements whose values in range [L, R]
    var cntWays = 0;
 
    // Stores count of numbers having
    // value lies in the range [L, R]
    var cntNum = 0;
 
    // Traverse the array
    for (var i = 0; i < N; i++) {
 
        // Checks if the array elements
        // lie in the given range
        if (arr[i] >= L && arr[i] <= R) {
 
            // Update cntNum
            cntNum++;
        }
    }
 
    // Stores factorial of numbers upto N
    var fact = calculateFactorial(cntNum);
 
    // Calculate total ways to select at least
    // K elements whose values lies in [L, R]
    for (var i = K; i <= cntNum; i++) {
 
        // Update cntWays
        cntWays += fact[cntNum] / (fact[i]
                                   * fact[cntNum - i]);
    }
 
    return cntWays;
}
 
// Driver Code
var arr = [ 12, 4, 6, 13, 5, 10 ];
var N = arr.length;
var K = 3;
var L = 4;
var R = 10;
document.write( cntWaysSelection(arr, N, K, L, R));
 
</script>
Producción: 

5

 

Complejidad temporal: O(N)  
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por offbeat 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 *