class Solution {
public:
struct comp {
bool operator()(const pair<int, int>& p1,
const pair<int, int>& p2) const {
if (p1.second == p2.second) {
return p1.first < p2.first;
} else {
return p1.second > p2.second;
}
}
};
int maxIncreasingGroups(vector<int>& usageLimits) {
set<pair<int, int>, comp> S;
for (int i = 0; i < usageLimits.size(); i++) {
S.insert({i, usageLimits[i]});
}
int groupSize = 1;
int maxGroups = 0;
while (1) {
if (groupSize > S.size())
break;
vector<int> V;
vector<pair<int, int>> P;
for (int i = 0; i < groupSize; i++) {
auto it = S.begin();
int num = it->first;
int limit = it->second;
limit--;
S.erase(it);
if (limit > 0)
P.push_back({num, limit});
}
maxGroups++;
// put the pairs back in S;
for (auto& a : P) {
S.insert({a.first, a.second});
}
// increase the groupSize
groupSize++;
}
return maxGroups;
}
};