Find the maximum amount that can be collected by selling movie tickets

Given an integer N and an array seats[] where N is the number of people standing in a line to buy a movie ticket and seat[i] is the number of empty seats in the ith row of the movie theater. The task is to find the maximum amount a theater owner can make by selling movie tickets to N people. Price of a ticket is equal to the maximum number of empty seats among all the rows.

Example:

Input: seats[] = {1, 2, 4}, N = 3
Output: 9

Person Empty Seats Ticket Cost
1 1 2 4 4
2 1 2 3 3
3 1 2 2 2

4 + 3 + 2 = 9

Input: seats[] = {2, 3, 5, 3}, N = 4
Output: 15



Approach: This problem can be solved by using a priority queue that will store the count of empty seats for every row and the maximum among them will be available at the top.

  • Create an empty priority_queue q and traverse the seats[] array and insert all element into the priority_queue.
  • Initialize two integer variable ticketSold = 0 and ans = 0 that will store the number of tickets sold and the total collection of the amount so far.
  • Now check while ticketSold < N and q.top() > 0 then remove the top element from the priority_queue and update ans by adding top element of the priority queue. Also store this top value in a variable temp and insert temp – 1 back to the priority_queue.
  • Repeat these steps until all the people have been sold the tickets and print the final result.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the maximum amount
// that can be collected by selling tickets
int maxAmount(int M, int N, int seats[])
{
  
    // Priority queue that stores
    // the count of empty seats
    priority_queue<int> q;
  
    // Insert each array element
    // into the priority queue
    for (int i = 0; i < M; i++) {
        q.push(seats[i]);
    }
  
    // To store the  total
    // number of tickets sold
    int ticketSold = 0;
  
    // To store the total amount
    // of collection
    int ans = 0;
  
    // While tickets sold are less than N
    // and q.top > 0 then update the collected
    // amount with the top of the priority
    // queue
    while (ticketSold < N && q.top() > 0) {
        ans = ans + q.top();
        int temp = q.top();
        q.pop();
        q.push(temp - 1);
        ticketSold++;
    }
  
    return ans;
}
  
// Driver code
int main()
{
    int seats[] = { 1, 2, 4 };
    int M = sizeof(seats) / sizeof(int);
    int N = 3;
  
    cout << maxAmount(N, M, seats);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach 
import java.util.*; 
  
class GFG 
{
    static int[] seats = new int[]{ 1, 2, 4 };
  
    // Function to return the maximum amount
    // that can be collected by selling tickets
    public static int maxAmount(int M, int N)
    {
  
        // Priority queue that stores
        // the count of empty seats
        PriorityQueue<Integer> q = 
            new PriorityQueue<Integer>(Collections.reverseOrder()); 
      
        // Insert each array element
        // into the priority queue
        for (int i = 0; i < M; i++)
        {
            q.add(seats[i]);
        }
  
        // To store the total
        // number of tickets sold
        int ticketSold = 0;
      
        // To store the total amount
        // of collection
        int ans = 0;
      
        // While tickets sold are less than N
        // and q.top > 0 then update the collected
        // amount with the top of the priority
        // queue
        while (ticketSold < N && q.peek() > 0)
        {
            ans = ans + q.peek();
            int temp = q.peek();
            q.poll();
            q.add(temp - 1);
            ticketSold++;
        }
        return ans;
    }
      
    // Driver code
    public static void main(String[] args) 
    {
        int M = seats.length;
        int N = 3;
      
        System.out.print(maxAmount(M, N));
    }
}
  
// This code is contributed by Sanjit_Prasad

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 implementation of the approach
  
# Function to return the maximum amount
# that can be collected by selling tickets
def maxAmount(M, N, seats):
      
    # Priority queue that stores
    # the count of empty seats
    q = []
  
    # Insert each array element
    # into the priority queue
    for i in range(M):
        q.append(seats[i])
  
    # To store the total
    # number of tickets sold
    ticketSold = 0
  
    # To store the total amount
    # of collection
    ans = 0
  
    # While tickets sold are less than N
    # and q.top > 0 then update the collected
    # amount with the top of the priority
    # queue
    q.sort(reverse = True)
    while (ticketSold < N and q[0] > 0):
        ans = ans + q[0]
        temp = q[0]
        q = q[1:]
        q.append(temp - 1)
        q.sort(reverse = True)
        ticketSold += 1
  
    return ans
  
# Driver code
if __name__ == '__main__':
    seats = [1, 2, 4]
    M = len(seats)
    N = 3
  
    print(maxAmount(N, M, seats))
  
# This code is contributed by Surendra_Gangwar

chevron_right


Output:

9

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.