<p>You are given a <strong>0-indexed</strong> integer array <code>tasks</code>, where <code>tasks[i]</code> represents the difficulty level of a task. In each round, you can complete either 2 or 3 tasks of the <strong>same difficulty level</strong>.</p>

<p>Return <em>the <strong>minimum</strong> rounds required to complete all the tasks, or </em><code>-1</code><em> if it is not possible to complete all the tasks.</em></p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> tasks = [2,2,3,3,2,4,4,4,4,4]
<strong>Output:</strong> 4
<strong>Explanation:</strong> To complete all the tasks, a possible plan is:
- In the first round, you complete 3 tasks of difficulty level 2. 
- In the second round, you complete 2 tasks of difficulty level 3. 
- In the third round, you complete 3 tasks of difficulty level 4. 
- In the fourth round, you complete 2 tasks of difficulty level 4.  
It can be shown that all the tasks cannot be completed in fewer than 4 rounds, so the answer is 4.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> tasks = [2,3,3]
<strong>Output:</strong> -1
<strong>Explanation:</strong> There is only 1 task of difficulty level 2, but in each round, you can only complete either 2 or 3 tasks of the same difficulty level. Hence, you cannot complete all the tasks, and the answer is -1.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= tasks.length &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= tasks[i] &lt;= 10<sup>9</sup></code></li>
</ul>

<p>&nbsp;</p>
<p><strong>Note:</strong> This question is the same as <a href="https://leetcode.com/problems/minimum-number-of-operations-to-make-array-empty/description/" target="_blank">2870: Minimum Number of Operations to Make Array Empty.</a></p>

class Solution {
public:
    bool IsPossible(int mid , vector <int> &nums) {
        int n = nums.size();

        int days = 0;

        for(int i = 0 ; i < n ; i++) {
            if(nums[i] == 1) return false;
            
            else {
                if(nums[i] % 3 == 0) days += nums[i] / 3;

                else {
                    int three = nums[i] / 3;

                    days += three;
                    int rem = nums[i] - (three*3);

                    if(rem % 2 == 0) days += rem / 2;
                    else {
                        days += ((rem+3) / 2);
                        days--;
                    }
                }
            }
        }

        return days <= mid;
    }
    int minimumRounds(vector<int>& tasks) {
        map <int,int> mp;
        for(auto it : tasks) mp[it]++;

        vector <int> nums;
        for(auto it : mp) nums.push_back(it.second);
        sort(nums.begin() , nums.end());

        int l = 1 , r = tasks.size();

        int ans = -1;

        while(l <= r) {
            int mid = l + (r-l) / 2;

            if(IsPossible(mid , nums)) {
                ans = mid;
                r = mid-1;
            }
            else l = mid+1;
        }

        return ans;
    }
};
109900