// C# porgrm for the above approach
using System;
using System.Collections.Generic;
public class Pair<T1, T2> {
public T1 Key;
public T2 Value;
public Pair(T1 key, T2 value) {
Key = key;
Value = value;
}
}
public class Program {
// Custom comparator to sort pairs by first element in descending order
public static int SortByFirstDesc(Pair<int, int> a, Pair<int, int> b) {
return b.Key.CompareTo(a.Key);
}
// Function that returns the maximum cost of an array of pairs choosing at most K pairs.
public static int MaxCost(Pair<int, int>[] a, int N, int K) {
// Initialize result and temporary sum variables
int res = 0, sum = 0;
// Initialize Set to store K greatest element for maximum sum
SortedSet<Pair<int, int>> s = new SortedSet<Pair<int, int>>(
Comparer<Pair<int, int>>.Create(SortByFirstDesc));
// Sort array by first element in descending order
Array.Sort(a, 0, N, Comparer<Pair<int, int>>.Create(SortByFirstDesc));
// Iterate in descending order
for (int i = 0; i < N; ++i) {
s.Add(new Pair<int, int>(a[i].Key, i));
sum += a[i].Key;
while (s.Count > K) {
Pair<int, int> p = s.Min;
sum -= p.Key;
s.Remove(p);
}
res = Math.Max(res, sum * a[i].Value);
}
return res;
}
// Driver Code
public static void Main() {
Pair<int, int>[] arr = new Pair<int, int>[] {
new Pair<int, int>(12, 3),
new Pair<int, int>(62, 21),
new Pair<int, int>(31, 16),
new Pair<int, int>(19, 2),
new Pair<int, int>(32, 19),
new Pair<int, int>(12, 17),
new Pair<int, int>(1, 7)
};
int N = arr.Length;
int K = 3;
Console.WriteLine(MaxCost(arr, N, K));
}
}
// This code is contributed by adityasharmadev01