#include <bits/stdc++.h>
using
namespace
std;
long
findMaximumTotalReward(vector<
int
>& taskCategories,
vector<
int
>& taskRewards)
{
map<
int
,
long
long
> categorySumOfRewards;
map<
int
,
int
> categoryMinimumReward;
int
n = taskCategories.size();
for
(
int
i = 0; i < n; i++) {
if
(!categorySumOfRewards.count(taskCategories[i])) {
categorySumOfRewards.insert({ taskCategories[i], 0 });
}
categorySumOfRewards[taskCategories[i]]
+= taskRewards[i];
if
(!categoryMinimumReward.count(
taskCategories[i])) {
categoryMinimumReward.insert(
{ taskCategories[i], INT_MAX });
}
categoryMinimumReward[taskCategories[i]]
= min(categoryMinimumReward[taskCategories[i]],
taskRewards[i]);
}
vector<
int
> minRewards;
long
long
maxTotalReward = 0LL;
int
categoryCount = categoryMinimumReward.size();
for
(
auto
it = categorySumOfRewards.begin();
it != categorySumOfRewards.end(); ++it) {
int
taskCategory = it->first;
long
long
sum = it->second;
maxTotalReward += (
long
long
)
(sum - categoryMinimumReward[taskCategory])
* (categoryCount);
minRewards.push_back(
categoryMinimumReward[taskCategory]);
}
sort(minRewards.begin(), minRewards.end());
for
(
int
i = 0; i < minRewards.size(); i++) {
maxTotalReward
+= (
long
long
)minRewards[i] * (i + 1);
}
return
(
long
)maxTotalReward;
}
int
main()
{
vector<
int
> taskCategories = { 3, 1, 2, 3 };
vector<
int
> taskRewards = { 2, 1, 4, 4 };
cout <<
"Max Total Rewards: "
<< findMaximumTotalReward(taskCategories,
taskRewards)
<< endl;
return
0;
}