-
Notifications
You must be signed in to change notification settings - Fork 2
/
min_triplet_diff.cc
108 lines (104 loc) · 2.62 KB
/
min_triplet_diff.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
given 3 arrays A, B, C, find min_{a\in A, b\in B, c\in C} {|a - b| + |b - c| + |c - a|}
*/
#include <algorithm>
#include <iostream>
#define ABS(A, B) ((A) < (B) ? (B) - (A) : (A) - (B))
int min_triplet(const size_t nA, const size_t nB, const size_t nC, int *A, int *B, int *C, size_t &idx_A, size_t &idx_B, size_t &idx_C) {
int current_sum;
size_t ia = 0, ib = 0, ic = 0;
if (nA == 0 || nB == 0 || nC == 0) {
return -1;
}
std::sort(A, A + nA);
std::sort(B, B + nB);
std::sort(C, C + nC);
idx_A = 0;
idx_B = 0;
idx_C = 0;
current_sum = ABS(A[0], B[0]) + ABS(B[0], C[0]) + ABS(C[0], A[0]);
while (ia < nA && ib < nB && ic < nC) {
if (A[ia] <= B[ib] && A[ia] <= C[ic]) {
if (ia + 1 < nA) {
++ia;
int sum = ABS(A[ia], B[ib]) + ABS(B[ib], C[ic]) + ABS(C[ic], A[ia]);
if (sum < current_sum) {
idx_A = ia;
idx_B = ib;
idx_C = ic;
current_sum = sum;
}
}else {
break;
}
}else if (B[idx_B] <= C[idx_C] && B[idx_B] <= A[idx_A]) {
if (ib + 1 < nB) {
++ib;
int sum = ABS(A[ia], B[ib]) + ABS(B[ib], C[ic]) + ABS(C[ic], A[ia]);
if (sum < current_sum) {
idx_A = ia;
idx_B = ib;
idx_C = ic;
current_sum = sum;
}
}else {
break;
}
}else {
if (ic + 1 < nC) {
++ic;
int sum = ABS(A[ia], B[ib]) + ABS(B[ib], C[ic]) + ABS(C[ic], A[ia]);
if (sum < current_sum) {
idx_A = ia;
idx_B = ib;
idx_C = ic;
current_sum = sum;
}
}else {
break;
}
}
}
return current_sum;
}
int main(int argc, char *argv[]) {
//std::cout << ABS(5 + 3 - 1, 2 + 9) << std::endl;
size_t nA, nB, nC, idx_A, idx_B, idx_C;
int *A, *B, *C;
std::cin >> nA >> nB >> nC;
if (nA == 0 || nB == 0 || nC == 0) {
return 0;
}
//std::cout << nA << ", " << nB << ", " << nC << std::endl;
A = new int[nA];
B = new int[nB];
C = new int[nC];
for (size_t i = 0; i < nA; ++i) {
std::cin >> A[i];
}
for (size_t i = 0; i < nB; ++i) {
std::cin >> B[i];
}
for (size_t i = 0; i < nC; ++i) {
std::cin >> C[i];
}
min_triplet(nA, nB, nC, A, B, C, idx_A, idx_B, idx_C);
std::cout << "A: ";
for (size_t i = 0; i < nA; ++i) {
std::cout << A[i] << ", ";
}
std::cout << "\nB: ";
for (size_t i = 0; i < nB; ++i) {
std::cout << B[i] << ", ";
}
std::cout << "\nC: ";
for (size_t i = 0; i < nC; ++i) {
std::cout << C[i] << ", ";
}
std::cout << "\n";
std::cout << "|" << A[idx_A] << " - " << B[idx_B] << "| + |"<<B[idx_B] << " - " << C[idx_C] << "| + |" << C[idx_C] << " - " << A[idx_A] << "| = " << (ABS(A[idx_A], B[idx_B]) + ABS(B[idx_B], C[idx_C]) + ABS(C[idx_C], A[idx_A])) << std::endl;
delete [] A;
delete [] B;
delete [] C;
return 0;
}