Program to find number of items left after selling n items in python

Suppose we have a list of numbers called items and another value n. A salesman has items in a bag with random IDs. The salesman can remove as many as n items from the bag. We have to find the minimum number of different IDs remaining in the bag after n removals.

The strategy is to remove items with the lowest frequencies first, as this minimizes the number of different IDs left.

Example

If the input is like items = [2, 2, 6, 6] and n = 2, then the output will be 1. We can sell two items with ID 2 (removing all of them), leaving only items with ID 6.

Algorithm

To solve this, we will follow these steps:

  • Count the frequency of each item ID
  • Sort frequencies in ascending order
  • Remove items starting with the lowest frequency until we reach n removals
  • Return the number of different IDs remaining

Implementation

from collections import Counter

def find_remaining_items(items, n):
    # Count frequency of each item ID
    frequency_count = Counter(items)
    remaining_ids = len(frequency_count)
    
    # Sort frequencies in ascending order
    frequencies = sorted(frequency_count.values())
    
    # Remove items starting with lowest frequency
    for freq in frequencies:
        if freq <= n:
            n -= freq
            remaining_ids -= 1
        else:
            break
    
    return remaining_ids

# Test the function
items = [2, 2, 6, 6]
n = 2
result = find_remaining_items(items, n)
print(f"Items: {items}")
print(f"Removals allowed: {n}")
print(f"Minimum different IDs remaining: {result}")
Items: [2, 2, 6, 6]
Removals allowed: 2
Minimum different IDs remaining: 1

How It Works

Let's trace through the example step by step:

from collections import Counter

items = [2, 2, 6, 6]
n = 2

# Step 1: Count frequencies
frequency_count = Counter(items)
print("Frequency count:", dict(frequency_count))

# Step 2: Sort frequencies
frequencies = sorted(frequency_count.values())
print("Sorted frequencies:", frequencies)

# Step 3: Remove items with lowest frequencies
remaining_ids = len(frequency_count)
print("Initial different IDs:", remaining_ids)

for i, freq in enumerate(frequencies):
    print(f"\nStep {i+1}: Frequency = {freq}, Removals left = {n}")
    if freq <= n:
        n -= freq
        remaining_ids -= 1
        print(f"  Removed all items with this frequency")
        print(f"  Removals left: {n}, IDs remaining: {remaining_ids}")
    else:
        print(f"  Cannot remove all items (need {freq}, have {n})")
        break

print(f"\nFinal result: {remaining_ids} different IDs remaining")
Frequency count: {2: 2, 6: 2}
Sorted frequencies: [2, 2]
Initial different IDs: 2

Step 1: Frequency = 2, Removals left = 2
  Removed all items with this frequency
  Removals left: 0, IDs remaining: 1

Step 2: Frequency = 2, Removals left = 0
  Cannot remove all items (need 2, have 0)

Final result: 1 different IDs remaining

Additional Examples

# Example 1: More complex case
items1 = [1, 1, 2, 3, 3, 3, 4, 4, 4, 4]
n1 = 5
result1 = find_remaining_items(items1, n1)
print(f"Items: {items1}")
print(f"Removals: {n1}, Remaining IDs: {result1}")

# Example 2: Can remove all items
items2 = [1, 2, 3]
n2 = 3
result2 = find_remaining_items(items2, n2)
print(f"\nItems: {items2}")
print(f"Removals: {n2}, Remaining IDs: {result2}")
Items: [1, 1, 2, 3, 3, 3, 4, 4, 4, 4]
Removals: 5, Remaining IDs: 2

Items: [1, 2, 3]
Removals: 3, Remaining IDs: 0

Conclusion

The optimal strategy is to remove items with the lowest frequencies first. This greedy approach ensures we minimize the number of different item IDs remaining in the bag after n removals.

Updated on: 2026-03-25T12:50:25+05:30

3K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements