Вася строит дом
Мальчик Вася живёт на координатной прямой. На этой прямой в точке A располагается школа, а в точке B — любимый Васин компьютерный клуб. Также в точках …,−d,0,d,…,k⋅d,…, где k — произвольное целое число, а d — чётное натуральное число, расположены киоски с мороженым. Вася хочет построить дом в некоторой точке с целой координатой. При этом, ему хочется, чтобы расстояние от дома до школы и от дома до компьютерного клуба было одинаковым. Если это вдруг невозможно, то он хочет, чтобы сумма этих расстояний была как можно меньше, а также чтобы расстояния отличались как можно меньше друг от друга. Если под Васин дом подходит несколько вариантов точек, то он выберет ту, расстояние от которой до ближайшего киоска с мороженым минимально. Помогите Васе выбрать точку, где строить дом, а также выведите расстояние до ближайшего киоска с мороженым. Вася может строить дом в точке, где уже есть другие строения.
Входные данные
В единственной строке входных данных заданы три числа — A, B и d. Гарантируется, что A и B — целые числа, по модулю не превышающие 2⋅109, A≠B. d — чётное натуральное число, 2≤d≤2⋅109.
Выходные данные
В единственной строке выходных данных выведите два целых числа — координату точки, где Васе необходимо построить дом, и расстояние до ближайшего киоска с мороженым.
Примеры
Ввод
1 5 4
Вывод
3 1
Ввод
1 6 4
Вывод
4 0
#include
#include
#include
using namespace std;
void main() {
int a, b, d, ans, start_loc;
int distance1;
vector ice;
cin >> a >> b >> d;
if (a > b) swap(a, b);
start_loc = (b - a) / 2 + a;
int k = b / d;
while (k * d >= a) {
ice.push_back(k * d);
--k;
}
if ((b - a) % 2 == 1) {
int counter_low = start_loc, counter_high = start_loc + 1;
bool flag = true;
int temp_l = counter_low, temp_h = counter_high;
while (temp_l >= a && flag) {
for (auto c : ice) {
if (c == temp_l) {
flag = false;
break;
}
}
--temp_l;
}
++temp_l;
flag = true;
while (temp_h abs(temp_h - counter_high)) {
distance1 = abs(temp_h - counter_high);
ans = counter_high;
}
else {
ans = counter_high;
distance1 = abs(temp_l - counter_low);
}
} else {
ans = start_loc;
bool flag = true;
int to_down = start_loc, to_up = start_loc;
while (to_down >= a && flag) {
for (auto c : ice) {
if (c == to_down) {
flag = false;
break;
}
}
--to_down;
}
++to_down;
flag = true;
while (to_up abs(to_up - start_loc)) {
distance1 = abs(to_up - start_loc);
}
else {
distance1 = abs(to_down - start_loc);
}
}
cout