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


Output:

9


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.



Improved By : Sanjit_Prasad