using
System;
public
class
MainClass
{
public
static
int
BinarySearch(
int
[] ar2,
int
left,
int
right,
int
x)
{
if
(left > right)
return
left - 1;
int
mid = (left + right) / 2;
if
(ar2[mid] == x)
return
mid;
else
if
(ar2[mid] > x)
return
BinarySearch(ar2, left, mid - 1, x);
else
return
BinarySearch(ar2, mid + 1, right, x);
}
public
static
void
PrintClosest(
int
[] ar1,
int
[] ar2,
int
m,
int
n,
int
x)
{
int
diff =
int
.MaxValue;
int
res_l = 0, res_r = 0;
int
l = 0, r = n - 1;
while
(l < m && r >= 0) {
if
(Math.Abs(ar1[l] + ar2[r] - x) < diff) {
res_l = l;
res_r = r;
diff = Math.Abs(ar1[l] + ar2[r] - x);
}
if
(ar1[l] + ar2[r] > x)
r--;
else
l++;
}
Console.WriteLine(
"The closest pair is ["
+ ar1[res_l] +
", "
+ ar2[res_r]
+
"]"
);
}
public
static
void
Main()
{
int
[] ar1 = { 1, 4, 5, 7 };
int
[] ar2 = { 10, 20, 30, 40 };
int
m = ar1.Length;
int
n = ar2.Length;
int
x = 38;
Array.Sort(ar2);
for
(
int
i = 0; i < m; i++) {
int
index
= BinarySearch(ar2, 0, n - 1, x - ar1[i]);
if
(index >= 0 && index < n
&& Math.Abs(ar1[i] + ar2[index] - x)
< Math.Abs(ar1[i] + ar2[index - 1]
- x)) {
PrintClosest(ar1, ar2, m, n, x);
return
;
}
else
if
(index > 0
&& Math.Abs(ar1[i] + ar2[index - 1]
- x)
< Math.Abs(ar1[i] + ar2[index]
- x)) {
PrintClosest(ar1, ar2, m, n, x);
return
;
}
}
}
}