Check if all people can vote on two machines
Last Updated :
06 Feb, 2023
There are n people and two identical voting machines. We are also given an array a[] of size n such that a[i] stores time required by i-th person to go to any machine, mark his vote and come back. At one time instant, only one person can be there on each of the machines. Given a value x, defining the maximum allowable time for which machines are operational, check whether all persons can cast their vote or not.
Examples:
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.
Method 1
Let sum be the total time taken by all n people. If sum <=x, then answer will obviously be YES. Otherwise, we need to check whether the given array can be split into two parts such that the sum of the first part and sum of the second part are both less than or equal to x. The problem is similar to the knapsack problem. Imagine two knapsacks each with capacity x. Now find, maximum people who can vote on any one machine i.e. find maximum subset sum for a knapsack of capacity x. Let this sum be s1. Now if (sum-s1) <= x, then answer is YES else answer is NO.
C++
#include<bits/stdc++.h>
using namespace std;
bool canVote( int a[], int n, int x)
{
int dp[n+1][x+1];
memset (dp, 0, sizeof (dp));
int sum = 0;
for ( int i=0; i<=n; i++ )
sum += a[i];
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];
return (sum - dp[n][x] <= x);
}
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
public class Main
{
static boolean canVote( int [] a, int n, int x)
{
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 ;
}
}
int sum = 0 ;
for ( int i = 0 ; i < n; i++ )
sum += a[i];
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];
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" );
}
}
}
|
Python3
def canVote(a, n, x):
dp = [[ 0 ] * (x + 1 ) for _ in range (n + 1 )]
a = a[:]
a.append( 0 )
sm = 0
for i in range (n + 1 ):
sm + = a[i]
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]
return (sm - dp[n][x]) < = x
if __name__ = = "__main__" :
n = 3
x = 4
a = [ 2 , 4 , 2 ]
print ( "YES" if canVote(a, n, x) else "NO" )
|
C#
using System;
class GFG {
static bool canVote( int [] a, int n, int x)
{
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;
}
}
int sum = 0;
for ( int i = 0; i < n; i++ )
sum += a[i];
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];
return (sum - dp[n, x] >= x);
}
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" );
}
}
}
|
Javascript
<script>
function canVote(a, n, x)
{
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;
}
}
let sum = 0;
for (let i=0; i<n; i++ )
sum += a[i];
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];
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" );
}
</script>
|
Time Complexity: O(x * n)
Auxiliary Space: O(x * n)
Method 2
The above method uses O(x * n) extra space, here we give a method that uses O(n) extra space.
Idea is to sort the array and then check if we can get any two array that can be a subarray which can be between the start and end of array such that its sum less than or equal to x and the sum of remaining elements is also less than x.
We use prefix sum for this purpose. We set i and j and check if sorted array between i to j – 1 gives sum <= x and the remaining elements also sum to sum <= x.
C++
#include<bits/stdc++.h>
using namespace std;
bool canVote(vector< int > a, int n, int x)
{
int total_sum = 0;
for ( auto x : a){
total_sum += x;
}
if (total_sum <= x)
return true ;
sort(a.begin(), a.end());
vector< int > presum(a.size(), 0);
presum[0] = a[0];
for ( int i = 1; i < presum.size(); i++){
presum[i] = presum[i - 1] + a[i];
}
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 ;
}
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
import java.io.*;
import java.util.*;
class GFG {
public static boolean canVote( int a[], int n, int x)
{
int total_sum = 0 ;
for ( int z : a) {
total_sum += z;
}
if (total_sum <= x)
return true ;
Arrays.sort(a);
int presum[] = new int [a.length];
presum[ 0 ] = a[ 0 ];
for ( int i = 1 ; i < presum.length; i++) {
presum[i] = presum[i - 1 ] + a[i];
}
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 ;
}
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" );
}
}
|
Python3
def canVote(a, n, x):
total_sum = 0
for i in range ( len (a)):
total_sum + = a[i]
if (total_sum < = x):
return True
a.sort()
presum = [ 0 for i in range ( len (a))]
presum[ 0 ] = a[ 0 ]
for i in range ( 1 , len (presum)):
presum[i] = presum[i - 1 ] + a[i]
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
n = 3
x = 4
a = [ 2 , 4 , 2 ]
if (canVote(a, n, x)):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
using System.Linq;
class GFG
{
public static bool CanVote( int [] a, int n, int x)
{
int total_sum = 0;
foreach ( int z in a) {
total_sum += z;
}
if (total_sum <= x)
return true ;
Array.Sort(a);
int [] presum = new int [a.Length];
presum[0] = a[0];
for ( int i = 1; i < presum.Length; i++) {
presum[i] = presum[i - 1] + a[i];
}
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 ;
}
public static void Main( string [] args)
{
int n = 3;
int x = 4;
int [] a = { 2, 4, 2 };
if (CanVote(a, n, x) == true )
Console.WriteLine( "YES" );
else
Console.WriteLine( "NO" );
}
}
|
Javascript
function canVote(a, n, x)
{
let total_sum = 0;
for (let x of a){
total_sum += x;
}
if (total_sum <= x)
return true ;
a.sort((a, b) => a - b);
let presum = new Array(a.length).fill(0);
presum[0] = a[0];
for (let i = 1; i < presum.length; i++){
presum[i] = presum[i - 1] + a[i];
}
for (let i = 0; i < presum.length; i++){
for (let j = i + 1; j < presum.length; j++){
let arr1_sum = (presum[i] +
(total_sum - presum[j]));
if ((arr1_sum <= x) &&
(total_sum - arr1_sum) <= x)
return true ;
}
}
return false ;
}
let n = 3, x = 4;
let a = [2, 4, 2];
console.log(canVote(a, n, x) ? "YES" : "NO" );
|
Time Complexity: O(n * n) // since two loops are nested inside each other the have a time complexity of n*n
Auxiliary Space: O(n) // since an extra vector of size equal to the length of the array
Share your thoughts in the comments
Please Login to comment...