思路
首先啊,题目中距离D实际上可以变成以下的最大值问题:
D = 2 * max( | a - b| , | b - c | , | c - a |);
然后最小化D, 即变成:
min(D)= min ( 2 * max( | a - b| , | b - c | , | c - a |) );
即需要能减少某两点之间的差值,才能使得这个表达式可能有新的最小值出现,那么只需要把a b c 三个数中最小值所在的队列中的元素弹出即可,然后使用新的队首元素重新计算上式,当某个队列为空时,结束循环
程序
/*************************************************************************
> File Name: solve.cpp
> Author:
> Mail:
> Created Time:
************************************************************************/
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;
int min_num(int a, int b, int c) {
if (a > b) swap(a, b);
if (a > c) swap(a, c);
return a;
}
int func(queue<int> que1, queue<int> que2, queue<int> que3) {
//TODO
int dist = 999999;
while(!que1.empty() && !que2.empty() && !que3.empty() ){
int a = que1.front();
int b = que2.front();
int c = que3.front();
dist = min(2 * max (max ( abs(a - b) , abs (b - c)) , abs( c - a)) , dist);
int min_ele = min_num( a , b , c );
if ( a == min_ele ){
que1.pop();
}else if ( b == min_ele){
que2.pop();
}else{
que3.pop();
}
}
return dist;
}
int main() {
int m, n, k, x;
queue<int> que1, que2, que3;
cin >> m >> n >> k;
for (int i = 0; i < m; i++) {
cin >> x;
que1.push(x);
}
for (int i = 0; i < n; i++) {
cin >> x;
que2.push(x);
}
for (int i = 0; i < k; i++) {
cin >> x;
que3.push(x);
}
cout << func(que1, que2, que3) << endl;
return 0;
}