Skip to content
Related Articles

Related Articles

Improve Article

Distributing items when a person cannot take more than two items of same type

  • Difficulty Level : Medium
  • Last Updated : 24 May, 2021

Given N sweets, which can be of many different types and k customers, one customer won’t make the same type of sweet more than 2 pieces, the task is to find if it is possible to distribute all, then print “Yes” or otherwise “No”.
Given an array, arr[] represents an array of sweets. arr[i] is type of sweet.

Examples:  

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Input : arr[] = {1, 1, 2, 3, 1}, 
            k = 2;
Output : Yes
There are three pieces of sweet type 1,
one piece of type 2 and one piece of 
type 3. Two customers can distribute 
sweets under given constraints.

Input : arr[] = {2, 3, 3, 5, 3, 3}, 
            k = 2;
Output : Yes

Input : arr[] = {2, 3, 3, 5, 3, 3, 3}, 
            k = 2;
Output : No 

Method 1: 
1- Traverse array for each element. 
2- Count occurrences of each element in the array 
3- Check if the result of each element must be less than or equal to 2*k. 



C++




// C++ program for above implementation
#include <bits/stdc++.h>
using namespace std;
 
// Function to check occurrence of each element
bool checkCount(int arr[], int n, int k)
{
    int count;
 
    // Start traversing the elements
    for (int i = 0; i < n; i++) {
 
        // Count occurrences of current element
        count = 0;
        for (int j = 0; j < n; j++) {
            if (arr[j] == arr[i])
                count++;
 
            // If count of any element is greater
            // than 2*k then return false
            if (count > 2 * k)
                return false;
        }
    }
 
    return true;
}
 
// Drivers code
int main()
{
    int arr[] = { 1, 1, 2, 3, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 2;
    checkCount(arr, n, k) ? cout << "Yes"
                           : cout << "No";
 
    return 0;
}

Java




// java program for above implementation
import java.io.*;
 
public class GFG {
     
    // Function to check occurrence of
    // each element
    static boolean checkCount(int []arr,
                            int n, int k)
    {
        int count;
     
        // Start traversing the elements
        for (int i = 0; i < n; i++)
        {
     
            // Count occurrences of
            // current element
            count = 0;
            for (int j = 0; j < n; j++)
            {
                if (arr[j] == arr[i])
                    count++;
     
                // If count of any element
                // is greater than 2*k then
                // return false
                if (count > 2 * k)
                    return false;
            }
        }
     
        return true;
    }
     
    // Drivers code
    static public void main (String[] args)
    {
        int []arr = { 1, 1, 2, 3, 1 };
        int n = arr.length;
        int k = 2;
         
        if(checkCount(arr, n, k))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by vt_m.

Python3




# Python 3 program for above implementation
 
# Function to check occurrence
# of each element
def checkCount(arr, n, k):
 
    # Start traversing the elements
    for i in range(n):
 
        # Count occurrences of
        # current element
        count = 0
        for j in range(n):
            if arr[j] == arr[i]:
                count += 1
 
            # If count of any element is greater
            # than 2*k then return false
            if count > 2 * k:
                return False
    return True
 
# Driver code
arr = [1, 1, 2, 3, 1]
n = len(arr)
k = 2
if checkCount(arr, n, k) == True:
    print("Yes")
else:
    print("No")
 
# This code is contributed by Shrikant13

C#




// C# program for above implementation
using System;
 
public class GFG {
     
    // Function to check occurrence
    // of each element
    static bool checkCount(int []arr,
                          int n, int k)
    {
        int count;
     
        // Start traversing the elements
        for (int i = 0; i < n; i++)
        {
     
            // Count occurrences of
            // current element
            count = 0;
            for (int j = 0; j < n; j++)
            {
                if (arr[j] == arr[i])
                    count++;
     
                // If count of any element
                // is greater than 2*k then
                // return false
                if (count > 2 * k)
                    return false;
            }
        }
     
        return true;
    }
     
    // Drivers code
    static public void Main ()
    {
        int []arr = { 1, 1, 2, 3, 1 };
        int n = arr.Length;
        int k = 2;
         
        if(checkCount(arr, n, k))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by vt_m.

PHP




<?php
// PHP program for above implementation
 
// Function to check occurrence
// of each element
function checkCount($arr, $n, $k)
{
    $count;
 
    // Start traversing the elements
    for($i = 0; $i < $n; $i++)
    {
 
        // Count occurrences of
        // current element
        $count = 0;
        for($j = 0; $j < $n; $j++)
        {
            if ($arr[$j] == $arr[$i])
                $count++;
 
            // If count of any element
            // is greater than 2*k then
            // return false
            if ($count > 2 * $k)
                return false;
        }
    }
 
    return true;
}
 
    // Driver Code
    $arr = array(1, 1, 2, 3, 1);
    $n =count($arr);
    $k = 2;
    if(checkCount($arr, $n, $k))
        echo "Yes";
    else
        echo "No";
 
// This code is contributed by anuj_67.
?>

Javascript




<script>
    // Javascript program for above implementation
     
    // Function to check occurrence
    // of each element
    function checkCount(arr, n, k)
    {
        let count;
      
        // Start traversing the elements
        for (let i = 0; i < n; i++)
        {
      
            // Count occurrences of
            // current element
            count = 0;
            for (let j = 0; j < n; j++)
            {
                if (arr[j] == arr[i])
                    count++;
      
                // If count of any element
                // is greater than 2*k then
                // return false
                if (count > 2 * k)
                    return false;
            }
        }
      
        return true;
    }
     
    let arr = [ 1, 1, 2, 3, 1 ];
    let n = arr.length;
    let k = 2;
 
    if(checkCount(arr, n, k))
      document.write("Yes");
    else
      document.write("No");
             
</script>

Output:

Yes

Time Complexity: O(n^2) 

Method 2: 
1. Maintain a hash for 32 different type of sweets. 
2. Traverse an array and check for every arr[i]  

hash[arr[i]] <= 2*k. 

C++




// C++ program for above implementation
#include <bits/stdc++.h>
using namespace std;
 
// Function to check hash array
// corresponding to the given array
bool checkCount(int arr[], int n, int k)
{
    unordered_map<int, int> hash;
 
    // Maintain a hash
    for (int i = 0; i < n; i++)
        hash[arr[i]]++;
 
    // Check for each value in hash
    for (auto x : hash)
        if (x.second > 2 * k)
            return false;
 
    return true;
}
 
// Drivers code
int main()
{
    int arr[] = { 1, 1, 2, 3, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 2;
    checkCount(arr, n, k) ? cout << "Yes"
                           : cout << "No";
    return 0;
}

Java




// Java program for above implementation
import java.util.HashMap;
import java.util.Map;
 
class GfG
{
 
    // Function to check hash array
    // corresponding to the given array
    static boolean checkCount(int arr[], int n, int k)
    {
        HashMap <Integer, Integer> hash = new HashMap<>();
     
        // Maintain a hash
        for (int i = 0; i < n; i++)
        {
            if (!hash.containsKey(arr[i]))
                hash.put(arr[i], 0);
            hash.put(arr[i], hash.get(arr[i]) + 1);
        }
     
        // Check for each value in hash
        for (Map.Entry x : hash.entrySet())
            if ((int)x.getValue() > 2 * k)
                return false;
     
        return true;
    }
 
    // Driver code
    public static void main(String []args)
    {
         
        int arr[] = { 1, 1, 2, 3, 1 };
        int n = arr.length;
        int k = 2;
        if (checkCount(arr, n, k))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Rituraj Jain

Python3




# Python3 program for above implementation
from collections import defaultdict
 
# Function to check hash array
# corresponding to the given array
def checkCount(arr, n, k):
 
    mp = defaultdict(lambda:0)
 
    # Insert all array elements in
    # hash table Maintain a hash
    for i in range(n):
        mp[arr[i]] += 1
 
    # Check for each value in hash
    for key, values in mp.items():
        if values > 2 * k:
            return False
    return True
 
# Driver code
arr = [ 1, 1, 2, 3, 1 ]
n = len(arr)
k = 2
if checkCount(arr, n, k) == True:
    print("Yes")
else:
    print("No")
 
# This code is contributed by Shrikant13

C#




// C# program for above implementation
using System;
using System.Collections.Generic;
 
class GfG
{
 
    // Function to check hash array
    // corresponding to the given array
    static Boolean checkCount(int []arr, int n, int k)
    {
        Dictionary<int,int> hash = new Dictionary<int,int>();
     
        // Maintain a hash
        for (int i = 0; i < n; i++)
        {
            if(hash.ContainsKey(arr[i]))
            {
                var val = hash[arr[i]];
                hash.Remove(arr[i]);
                hash.Add(arr[i], val + 1);
            }
            else
            {
                hash.Add(arr[i], 0);
            }
        }
     
        // Check for each value in hash
        foreach(KeyValuePair<int, int> x in hash)
            if ((int)x.Value > 2 * k)
                return false;
     
        return true;
    }
 
    // Driver code
    public static void Main(String []args)
    {
         
        int []arr = { 1, 1, 2, 3, 1 };
        int n = arr.Length;
        int k = 2;
        if (checkCount(arr, n, k))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
/* This code is contributed by PrinciRaj1992 */

Output:

Yes

Time Complexity: O(n)
 




My Personal Notes arrow_drop_up
Recommended Articles
Page :