fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. long long findMaximumProfit(vector<int>& category, vector<int>& price) {
  5. int n = category.size();
  6.  
  7. // 1. اجمع كل الأسعار حسب الكاتيجوري
  8. unordered_map<int, vector<int>> items;
  9. for (int i = 0; i < n; i++) {
  10. items[category[i]].push_back(price[i]);
  11. }
  12.  
  13. vector<int> openCategory; // أرخص حاجة من كل كاتيجوري
  14. vector<int> rest; // باقي الحاجات الأغلى
  15.  
  16. // 2. لكل كاتيجوري: خد أرخص حاجة ووزع الباقي
  17. for (auto &kv : items) {
  18. auto &v = kv.second;
  19. sort(v.begin(), v.end()); // رتب الأسعار
  20. openCategory.push_back(v[0]); // أرخص واحد لفتح الكاتيجوري
  21. for (int i = 1; i < (int)v.size(); i++) {
  22. rest.push_back(v[i]); // الباقي يتحط في rest
  23. }
  24. }
  25.  
  26. // 3. رتبهم
  27. sort(openCategory.begin(), openCategory.end()); // الأرخص الأول
  28. sort(rest.rbegin(), rest.rend()); // الأغلى في الآخر
  29.  
  30. // 4. احسب الربح
  31. long long profit = 0;
  32. int distinct = 0;
  33.  
  34. // بيع الأرخص (فتح الكاتيجوريز)
  35. for (int p : openCategory) {
  36. distinct++;
  37. profit += 1LL * p * distinct;
  38. }
  39.  
  40. // بيع الباقي (بعد ما الكاتيجوريز كلها اتفتحت)
  41. for (int p : rest) {
  42. profit += 1LL * p * distinct;
  43. }
  44.  
  45. return profit;
  46. }
  47.  
  48. int main() {
  49. vector<int> category = {3, 1, 2, 3};
  50. vector<int> price = {2, 1, 4, 4};
  51.  
  52. cout << findMaximumProfit(category, price) << endl;
  53. // Output: 29
  54. }
  55.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
29