Другие языки программирования и технологии

Код с++ надо укоротить

Вот задача
Вася строит дом
Мальчик Вася живёт на координатной прямой. На этой прямой в точке 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
Тут не надо циклов, тут надо немного математики.

Любую точку на прямой с целой координатой можно представить в виде k*d+l (k ∈ Z, l ∈ {0, 1, 2, ..., d-1}), при этом расстояние до левого киоска с мороженым будет l, а до правого — d-l.

Если построить дом в точке с координатой x, то расстояния до школы и клуба будут x-a и b-x (без ограничения общности можно считать, что a<b). Из условия равенства расстояний x-a = b-x получаем x = (a+b)/2. Если x — целое, то данная точка является искомой. Иначе надо рассмотреть точки [x] и [x]+1 (назовем их левая возможная точка и правая возможная точка соответственно).

В итоге получаем вот такую программу:
 #include   
#include

using namespace std;

void main() {
int a, b, d;
int ans, dist, l;
cin >> a >> b >> d;
ans = (a + b) / 2;
l = ans % d;
dist = min(l, d-l);
if ((a + b) % 2) {
int dist1 = min(l+1,d-l-1);
if(dist > dist1) { ++ans; dist=dist1; }
}
cout > b >> d;
ans = (a + b) / 2;
dist = ans % d;
if(dist >= d - dist) {
dist = d - dist;
if ((a + b) % 2) ++ans, --dist;
}
cout
Андрей Иванов
Андрей Иванов
12 091
Лучший ответ