using System.Collections.Generic;
public int Id { get; set; }
public int Value { get; set; }
public int Id1 { get; set; }
public int Id2 { get; set; }
public static void GetOptimalPairs(List<IdValuePair> a, List<IdValuePair> b, int target)
var optimalPairs = new List<OptimalPair>();
var pq = new PriorityQueue<OptimalPair, int>();
pq.Enqueue(new OptimalPair {Id1 = 0, Id2 = 0}, 0);
a.Sort((a, b) => b.Value - a.Value);
b.Sort((a, b) => b.Value - a.Value);
Console.WriteLine($"sorted a: {NestedListToString(a)}");
Console.WriteLine($"sorted b: {NestedListToString(b)}");
int currOptimalPairValue = 0;
for (int i = 0; i < a.Count(); i++)
for (int j = 0; j < b.Count(); j++)
int pairValue = a[i].Value + b[j].Value;
if (pairValue <= target && pairValue >= currOptimalPairValue)
pq.Enqueue(new OptimalPair {Id1 = a[i].Id, Id2 = b[j].Id}, -(pairValue));
currOptimalPairValue = pairValue;
int currPriority = int.MaxValue;
pq.TryDequeue(out op, out priority);
if (priority <= currPriority)
Console.WriteLine($"output> optimal pairs: {NestedListToString(optimalPairs)}");
public static void Main()
var a = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 2},
new IdValuePair() {Id = 2, Value = 4},
new IdValuePair() {Id = 3, Value = 6}
var b = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 2}
Console.WriteLine($"input> a: {NestedListToString(a)}, b: {NestedListToString(b)}");
GetOptimalPairs(a, b, target);
a = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 3},
new IdValuePair() {Id = 2, Value = 5},
new IdValuePair() {Id = 3, Value = 7},
new IdValuePair() {Id = 4, Value = 10}
b = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 2},
new IdValuePair() {Id = 2, Value = 3},
new IdValuePair() {Id = 3, Value = 4},
new IdValuePair() {Id = 4, Value = 5}
Console.WriteLine($"input> a: {NestedListToString(a)}, b: {NestedListToString(b)}");
GetOptimalPairs(a, b, target);
a = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 8},
new IdValuePair() {Id = 2, Value = 7},
new IdValuePair() {Id = 3, Value = 14}
b = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 5},
new IdValuePair() {Id = 2, Value = 10},
new IdValuePair() {Id = 3, Value = 14}
Console.WriteLine($"input> a: {NestedListToString(a)}, b: {NestedListToString(b)}");
GetOptimalPairs(a, b, target);
a = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 8},
new IdValuePair() {Id = 2, Value = 15},
new IdValuePair() {Id = 3, Value = 9}
b = new List<IdValuePair>()
new IdValuePair() {Id = 1, Value = 8},
new IdValuePair() {Id = 2, Value = 11},
new IdValuePair() {Id = 3, Value = 12}
Console.WriteLine($"input> a: {NestedListToString(a)}, b: {NestedListToString(b)}");
GetOptimalPairs(a, b, target);
private static string NestedListToString<T>
string openingBracket = $"{(asArray ? "[" : "{")}{(indented ? $"\n{new string('\t', level)}" : "")}";
string closingBracket = $"{(indented ? $"\n{new string('\t', level - 1)}" : "")}{(asArray ? "]" : "}")}";
string joinSeparator = $",{(indented ? $"\n{new string('\t', level)}" : "")}";
if (typeof(T).IsValueType || typeof(T) == typeof(String))
return $"{(asArray ? "[" : "{")}{string.Join(',', nestedList)}{(asArray ? "]" : "}")}";
else if (typeof(T).IsNested)
return $"{openingBracket}{string.Join(joinSeparator, nestedList.Select(i => JsonSerializer.Serialize(i)))}{closingBracket}";
var nestedListString = string.Join(joinSeparator,
nestedList.Select(nl => typeof(Program)
.GetMethod("NestedListToString")
.MakeGenericMethod(typeof(T).GetGenericArguments()[0])
.Invoke(null, new object[] { nl, asArray, indented, level + 1 })).ToList());
return $"{openingBracket}{nestedListString}{closingBracket}";