Subsecuencia más larga cuyo promedio es menor que K

Dada una array de N enteros positivos y Q consultas que consisten en un entero K, la tarea es imprimir la longitud de la subsecuencia más larga cuyo promedio es menor que K. 
Ejemplos: 
 

Entrada: a[] = {1, 3, 2, 5, 4} 
Consulta 1: K = 3 
Consulta 2: K = 5
Salida: 


Consulta 1: La subsecuencia es: {1, 3, 2, 4} o {1, 3, 2, 5} 
Consulta 2: La subsecuencia es: {1, 3, 2, 5, 4} 
 

Un enfoque ingenuo es generar todas las subsecuencias usando power-set y verificar la subsecuencia más larga cuyo promedio sea menor que K. 
Complejidad de tiempo: O (2 N * N) 
Un enfoque eficiente es ordenar los elementos de la array y encontrar el promedio de elementos comenzando desde la izquierda. Inserte el promedio de elementos calculados desde la izquierda en el contenedor ( vector o arrays ). Ordene el elemento del contenedor y luego use la búsqueda binaria para buscar el número K en el contenedor. La longitud de la subsecuencia más larga será, por lo tanto, el número de índice que devuelve upper_bound() para cada consulta.
A continuación se muestra la implementación del enfoque anterior. 
 

C++

// C++ program to perform Q queries
// to find longest subsequence whose
// average is less than K
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the length for every query
int longestSubsequence(int a[], int n, int q[], int m)
{
 
    // sort array of N elements
    sort(a, a + n);
    int sum = 0;
 
    // Array to store average from left
    int b[n];
 
    for (int i = 0; i < n; i++) {
        sum += a[i];
        double av = (double)(sum) / (double)(i + 1);
        b[i] = ((int)(av + 1));
    }
 
    // Sort array of average
    sort(b, b + n);
 
    // number of queries
 
    for (int i = 0; i < m; i++) {
        int k = q[i];
 
        // print answer to every query
        // using binary search
        int longest = upper_bound(b, b + n, k) - b;
 
        cout << "Answer to Query" << i + 1 << ": "
             << longest << endl;
    }
}
 
// Driver Code
int main()
{
    int a[] = { 1, 3, 2, 5, 4 };
    int n = sizeof(a) / sizeof(a[0]);
 
    // 4 queries
    int q[] = { 4, 2, 1, 5 };
    int m = sizeof(q) / sizeof(q[0]);
 
    longestSubsequence(a, n, q, m);
    return 0;
}

Java

// Java program to perform Q queries
// to find longest subsequence whose
// average is less than K
import java.util.Arrays;
 
class GFG
{
 
    // Function to print the length for every query
    static void longestSubsequence(int a[], int n,
                                    int q[], int m)
    {
 
        // sort array of N elements
        Arrays.sort(a);
        int sum = 0;
 
        // Array to store average from left
        int []b = new int[n];
 
        for (int i = 0; i < n; i++)
        {
            sum += a[i];
            double av = (double)(sum) / (double)(i + 1);
            b[i] = ((int)(av + 1));
        }
 
        // Sort array of average
        Arrays.sort(b);
 
        // number of queries
 
        for (int i = 0; i < m; i++)
        {
            int k = q[i];
 
            // print answer to every query
            // using binary search
            int longest = upperBound(b,0, n, k);
 
            System.out.println("Answer to Query" + (i + 1) +": "
                + longest);
        }
    }
    private static int upperBound(int[] a, int low, int high, int element)
    {
        while(low < high)
        {
            int middle = low + (high - low)/2;
            if(a[middle] > element)
                high = middle;
            else
                low = middle + 1;
        }
        return low;
    }
     
    // Driver Code
    public static void main(String[] args)
    {
        int a[] = { 1, 3, 2, 5, 4 };
        int n = a.length;
 
        // 4 queries
        int q[] = { 4, 2, 1, 5 };
        int m = q.length;
 
        longestSubsequence(a, n, q, m);
    }
}
 
/* This code contributed by PrinciRaj1992 */

Python3

# Python3 program to perform Q queries to find
# longest subsequence whose average is less than K
import bisect
 
# Function to print the length for every query
def longestSubsequence(a, n, q, m):
  
    # sort array of N elements
    a.sort()
    Sum = 0
 
    # Array to store average from left
    b = [None] * n
 
    for i in range(0, n): 
        Sum += a[i]
        av = Sum // (i + 1)
        b[i] = av + 1
 
    # Sort array of average
    b.sort()
 
    # number of queries
 
    for i in range(0, m): 
        k = q[i]
 
        # print answer to every query
        # using binary search
        longest = bisect.bisect_right(b, k)
 
        print("Answer to Query", i + 1, ":", longest)
 
# Driver Code
if __name__ == "__main__":
  
    a = [1, 3, 2, 5, 4] 
    n = len(a)
 
    # 4 queries
    q = [4, 2, 1, 5] 
    m = len(q)
 
    longestSubsequence(a, n, q, m)
     
# This code is contributed by Rituraj Jain

C#

// C# program to perform Q queries
// to find longest subsequence whose
// average is less than K
using System;
 
class GFG
{
     
    // Function to print the length for every query
    static void longestSubsequence(int []a, int n,
                                    int []q, int m)
    {
 
        // sort array of N elements
        Array.Sort(a);
        int sum = 0;
 
        // Array to store average from left
        int []b = new int[n];
 
        for (int i = 0; i < n; i++)
        {
            sum += a[i];
            double av = (double)(sum) / (double)(i + 1);
            b[i] = ((int)(av + 1));
        }
 
        // Sort array of average
        Array.Sort(b);
 
        // number of queries
 
        for (int i = 0; i < m; i++)
        {
            int k = q[i];
 
            // print answer to every query
            // using binary search
            int longest = upperBound(b,0, n, k);
 
            Console.WriteLine("Answer to Query" + (i + 1) +": "
                + longest);
        }
    }
     
    private static int upperBound(int[] a, int low,
                                    int high, int element)
    {
        while(low < high)
        {
            int middle = low + (high - low)/2;
            if(a[middle] > element)
                high = middle;
            else
                low = middle + 1;
        }
        return low;
    }
     
    // Driver Code
    static public void Main ()
    {
        int []a = { 1, 3, 2, 5, 4 };
        int n = a.Length;
 
        // 4 queries
        int []q = { 4, 2, 1, 5 };
        int m = q.Length;
 
        longestSubsequence(a, n, q, m);
    }
}
     
/* This code contributed by ajit */

Javascript

<script>
 
    // Javascript program to perform Q queries
    // to find longest subsequence whose
    // average is less than K
     
    // Function to print the length for every query
    function longestSubsequence(a, n, q, m)
    {
   
        // sort array of N elements
        a.sort(function(a, b){return a - b});
        let sum = 0;
   
        // Array to store average from left
        let b = new Array(n);
   
        for (let i = 0; i < n; i++)
        {
            sum += a[i];
            let av = parseInt((sum) / (i + 1), 10);
            b[i] = (av + 1);
        }
   
        // Sort array of average
        b.sort(function(a, b){return a - b});
   
        // number of queries
   
        for (let i = 0; i < m; i++)
        {
            let k = q[i];
   
            // print answer to every query
            // using binary search
            let longest = upperBound(b,0, n, k);
   
            document.write("Answer to Query" +
            (i + 1) +": "
                + longest + "</br>");
        }
    }
       
    function upperBound(a, low, high, element)
    {
        while(low < high)
        {
            let middle = low +
            parseInt((high - low)/2, 10);
            if(a[middle] > element)
                high = middle;
            else
                low = middle + 1;
        }
        return low;
    }
     
    let a = [ 1, 3, 2, 5, 4 ];
    let n = a.length;
 
    // 4 queries
    let q = [ 4, 2, 1, 5 ];
    let m = q.length;
 
    longestSubsequence(a, n, q, m);
     
</script>

Producción:  

Answer to Query1: 5
Answer to Query2: 2
Answer to Query3: 0
Answer to Query4: 5

Complejidad de tiempo: O(N*log N + M*log N) 
Espacio auxiliar: O(N)
 

Publicación traducida automáticamente

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