Comprobar si todas las personas pueden votar en dos máquinas

Hay n personas y dos máquinas de votar idénticas. También se nos da una array a[] de tamaño n tal que a[i] almacena el tiempo requerido por la i-ésima persona para ir a cualquier máquina, marcar su voto y regresar. En un instante de tiempo, solo una persona puede estar allí en cada una de las máquinas. Dado un valor x, que define el tiempo máximo permitido durante el cual las máquinas están operativas, verifique si todas las personas pueden emitir su voto o no.

Ejemplos: 

Input  : n = 3, x = 4
         a[] = {2, 4, 2}
Output: YES
There are  n = 3 persons say and maximum
allowed time is x = 4 units. Let the persons
be P0, P1, and P2 and two machines be M0 and M1.
At t0: P0 goes to M0
At t0: P1 goes to M1
At t2: M0 is free, P2 goes to M0
At t4: both M0 and M1 are free and all 3 have
        given their vote.

Método 1 
Sea sum el tiempo total empleado por todas las n personas. Si la suma <=x, entonces la respuesta obviamente será SÍ. De lo contrario, debemos verificar si la array dada se puede dividir en dos partes, de modo que la suma de la primera parte y la suma de la segunda parte sean ambas menores o iguales a x. El problema es similar al problema de la mochila . Imagina dos mochilas cada una con capacidad x. Ahora encuentre el máximo de personas que pueden votar en cualquier máquina, es decir, encuentre la suma máxima del subconjunto para una mochila de capacidad x. Sea esta suma s1. Ahora, si (suma-s1) <= x, entonces la respuesta es SÍ, de lo contrario, la respuesta es NO.

C++

// C++ program to check if all people can
// vote using two machines within limited
// time
#include<bits/stdc++.h>
using namespace std;
 
// Returns true if n people can vote using
// two machines in x time.
bool canVote(int a[], int n, int x)
{
    // dp[i][j] stores maximum possible number
    // of people among arr[0..i-1] can vote
    // in j time.
    int dp[n+1][x+1];
    memset(dp, 0, sizeof(dp));
 
    // Find sum of all times
    int sum = 0;
    for (int i=0; i<=n; i++ )
        sum += a[i];
 
    // Fill dp[][] in bottom up manner (Similar
    // to knapsack).
    for (int i=1; i<=n; i++)
        for (int j=1; j<=x; j++)
            if (a[i] <= j)
                dp[i][j] = max(dp[i-1][j],
                        a[i] + dp[i-1][j-a[i]]);
            else
                dp[i][j] = dp[i-1][j];
 
    // If remaining people can go to other machine.
    return (sum - dp[n][x] <= x);
}
 
// Driver code
int main()
{
    int n = 3, x = 4;
    int a[] = {2, 4, 2};
    canVote(a, n, x)? cout << "YES\n" :
                      cout << "NO\n";
    return 0;
}

Java

// Java program to check if all people can
// vote using two machines within limited
// time
public class Main
{
    // Returns true if n people can vote using
    // two machines in x time.
    static boolean canVote(int[] a, int n, int x)
    {
        // dp[i][j] stores maximum possible number
        // of people among arr[0..i-1] can vote
        // in j time.
        int[][] dp = new int[n + 1][x + 1];
        for(int i = 0; i < n + 1; i++)
        {
            for(int j = 0; j < x + 1; j++)
            {
                dp[i][j] = 0;
            }
        }
       
        // Find sum of all times
        int sum = 0;
        for (int i = 0; i < n; i++ )
            sum += a[i];
       
        // Fill dp[][] in bottom up manner (Similar
        // to knapsack).
        for (int i = 1; i < n; i++)
            for (int j = 1; j <= x; j++)
                if (a[i] <= j)
                    dp[i][j] = Math.max(dp[i - 1][j], a[i] + dp[i - 1][j - a[i]]);
                else
                    dp[i][j] = dp[i - 1][j];
       
        // If remaining people can go to other machine.
        return (sum - dp[n][x] >= x);
    }
     
    public static void main(String[] args) {
        int n = 3, x = 4;
        int[] a = {2, 4, 2};
        if(canVote(a, n, x))
        {
            System.out.println("YES");
        }
        else{
            System.out.println("NO");
        }
    }
}
 
// This code is contributed by mukesh07.

Python3

# Python3 program to check if all people can
# vote using two machines within limited
# time
 
# Function returns true if n people can vote
# using two machines in x time.
def canVote(a, n, x):
     
    # dp[i][j] stores maximum possible number
    # of people among arr[0..i-1] can vote
    # in j time.
    dp = [[0] * (x + 1) for _ in range(n + 1)]
    a = a[:]
    a.append(0)
 
    # Find sum of all times
    sm = 0
    for i in range(n + 1):
        sm += a[i]
 
    # Fill dp[][] in bottom up manner
    # (Similar to knapsack).
    for i in range(1, n + 1):
        for j in range(1, x + 1):
            if a[i] <= j:
                dp[i][j] = max(dp[i - 1][j], a[i] +
                               dp[i - 1][j - a[i]])
            else:
                dp[i][j] = dp[i - 1][j]
 
    # If remaining people can go to other machine.
    return (sm - dp[n][x]) <= x
 
# Driver Code
if __name__ == "__main__":
    n = 3
    x = 4
    a = [2, 4, 2]
    print("YES" if canVote(a, n, x) else "NO")
 
# This code is contributed
# by vibhu4agarwal

C#

// C# program to check if all people can
// vote using two machines within limited
// time
using System;
class GFG {
     
    // Returns true if n people can vote using
    // two machines in x time.
    static bool canVote(int[] a, int n, int x)
    {
        // dp[i][j] stores maximum possible number
        // of people among arr[0..i-1] can vote
        // in j time.
        int[,] dp = new int[n + 1, x + 1];
        for(int i = 0; i < n + 1; i++)
        {
            for(int j = 0; j < x + 1; j++)
            {
                dp[i, j] = 0;
            }
        }
      
        // Find sum of all times
        int sum = 0;
        for (int i = 0; i < n; i++ )
            sum += a[i];
      
        // Fill dp[][] in bottom up manner (Similar
        // to knapsack).
        for (int i = 1; i < n; i++)
            for (int j = 1; j <= x; j++)
                if (a[i] <= j)
                    dp[i, j] = Math.Max(dp[i - 1, j],
                            a[i] + dp[i - 1, j - a[i]]);
                else
                    dp[i, j] = dp[i - 1, j];
      
        // If remaining people can go to other machine.
        return (sum - dp[n, x] >= x);
    }
 
  // Driver code
  static void Main()
  {
    int n = 3, x = 4;
    int[] a = {2, 4, 2};
    if(canVote(a, n, x))
    {
        Console.Write("YES");
    }
    else{
        Console.Write("NO");
    }
  }
}
 
// This code is contributed by rameshtravel07.

Javascript

<script>
    // Javascript program to check if all people can
    // vote using two machines within limited
    // time
     
    // Returns true if n people can vote using
    // two machines in x time.
    function canVote(a, n, x)
    {
        // dp[i][j] stores maximum possible number
        // of people among arr[0..i-1] can vote
        // in j time.
        let dp = new Array(n+1);
        for(let i = 0; i < n + 1; i++)
        {
            dp[i] = new Array(x + 1);
            for(let j = 0; j < x+1; j++)
            {
                dp[i][j] = 0;
            }
        }
 
        // Find sum of all times
        let sum = 0;
        for (let i=0; i<n; i++ )
            sum += a[i];
 
        // Fill dp[][] in bottom up manner (Similar
        // to knapsack).
        for (let i = 1; i <= n; i++)
            for (let j = 1; j <= x; j++)
                if (a[i] <= j)
                    dp[i][j] = Math.max(dp[i-1][j],
                            a[i] + dp[i-1][j-a[i]]);
                else
                    dp[i][j] = dp[i-1][j];
 
        // If remaining people can go to other machine.
        return (sum - dp[n][x] <= x);
    }
     
    let n = 3, x = 4;
    let a = [2, 4, 2];
    if(canVote(a, n, x))
    {
        document.write("YES");
    }
    else{
        document.write("NO");
    }
 
// This code is contributed by decode2207.
</script>

Producción: 

YES

Tiempo Complejidad: O(x * n) 
Espacio Auxiliar: O(x * n)

Este artículo es una contribución de Ekta Goel . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Método 2
El método anterior usa O(x * n) espacio extra, aquí damos un método que usa O(n) espacio extra. 
La idea es ordenar la array y luego verificar si podemos obtener dos arrays que puedan ser un subarreglo que pueda estar entre el inicio y el final de la array, de modo que su suma sea menor o igual que x y la suma de los elementos restantes también sea menor. que x. 
Usamos el prefijo sum para este propósito. Establecemos i y j y verificamos si la array ordenada entre i a j – 1 da suma <= x y los elementos restantes también suman suma <= x.

C++

// C++ program to check if all people can
// vote using two machines within limited
// time
#include<bits/stdc++.h>
using namespace std;
 
// Returns true if n people can vote using
// two machines in x time.
bool canVote(vector<int> a, int n, int x)
{
    // calculate total sum i.e total
    // time taken by all people
    int total_sum = 0;
    for(auto x : a){
        total_sum += x;
    }
     
    // if total time is less than x then
    // all people can definitely vote
    // hence return true
    if(total_sum <= x)
        return true;
     
    // sort the vector
    sort(a.begin(), a.end());
     
    // declare a vector presum of same size
    // as that of a and initialize it with 0
    vector<int> presum(a.size(), 0);
 
    // prefixsum for first element
    // will be element itself
    presum[0] = a[0];
    // fill the array
    for(int i = 1; i < presum.size(); i++){
        presum[i] = presum[i - 1] + a[i];
    }
 
    // Set i and j and check if array
    // from i to j - 1 gives sum <= x
    for(int i = 0; i < presum.size(); i++){
        for(int j = i + 1; j < presum.size(); j++){
            int arr1_sum = (presum[i] +
                           (total_sum - presum[j]));
            if((arr1_sum <= x) &&
                        (total_sum - arr1_sum) <= x)
                return true;
        }   
    }
     
    return false;
}
 
// Driver code
int main()
{
    int n = 3, x = 4;
    vector<int>a = {2, 4, 2};
    canVote(a, n, x)? cout << "YES\n" :
                      cout << "NO\n";
    return 0;
}

Java

// Java program to check if all people can
// vote using two machines within limited
// time
import java.io.*;
import java.util.*;
 
class GFG {
    // Returns true if n people can vote using
    // two machines in x time.
    public static boolean canVote(int a[], int n, int x)
    {
        // calculate total sum i.e total
        // time taken by all people
        int total_sum = 0;
        for (int z : a) {
            total_sum += z;
        }
 
        // if total time is less than x then
        // all people can definitely vote
        // hence return true
        if (total_sum <= x)
            return true;
 
        // sort the array
        Arrays.sort(a);
 
        // declare a array presum of same size
        // as that of a and initialize it with 0
        int presum[] = new int[a.length];
 
        // prefixsum for first element
        // will be element itself
        presum[0] = a[0];
        // fill the array
        for (int i = 1; i < presum.length; i++) {
            presum[i] = presum[i - 1] + a[i];
        }
 
        // Set i and j and check if array
        // from i to j - 1 gives sum <= x
        for (int i = 0; i < presum.length; i++) {
            for (int j = i + 1; j < presum.length; j++) {
                int arr1_sum
                    = (presum[i] + (total_sum - presum[j]));
                if ((arr1_sum <= x)
                    && (total_sum - arr1_sum) <= x)
                    return true;
            }
        }
 
        return false;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int n = 3, x = 4;
        int a[] = { 2, 4, 2 };
        if (canVote(a, n, x) == true)
            System.out.println("YES");
        else
            System.out.println("NO");
    }
}
 
// This code is contributed by Rohit Pradhan

Python3

# Python3 program to check if all people can
# vote using two machines within limited
# time
 
# Returns true if n people can vote using
# two machines in x time.
def canVote(a, n, x):
 
    # calculate total sum i.e total
    # time taken by all people
    total_sum = 0
    for i in range(len(a)):
        total_sum += a[i]
     
    # if total time is less than x then
    # all people can definitely vote
    # hence return true
    if(total_sum <= x):
        return True
     
    # sort the list
    a.sort()
     
    # declare a list presum of same size
    # as that of a and initialize it with 0
    presum = [0 for i in range(len(a))]
 
    # prefixsum for first element
    # will be element itself
    presum[0] = a[0]
     
    # fill the array
    for i in range(1, len(presum)):
        presum[i] = presum[i - 1] + a[i]
     
    # Set i and j and check if array
    # from i to j - 1 gives sum <= x
    for i in range(0, len(presum)):
        for j in range(i + 1, len(presum)):
            arr1_sum = (presum[i] + (total_sum - presum[j]))
            if((arr1_sum <= x) and
               (total_sum - arr1_sum) <= x):
                return True
     
    return False
 
# Driver code
n = 3
x = 4
a = [2, 4, 2]
if(canVote(a, n, x)):
    print("YES")
else:
    print("NO")
 
# This code is contributed by ashutosh450

Complejidad de tiempo: O(n * n)  // dado que dos bucles están anidados uno dentro del otro, tienen una complejidad de tiempo de n*n
Espacio auxiliar: O(n) // ya que un vector adicional de tamaño igual a la longitud de la array
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

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