C/C++

Вася строит дом Задача С++

Вася строит дом
Мальчик Вася живёт на координатной прямой. На этой прямой в точке 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
using namespace std;
int main() {
int school, club, ice_cream, home, distance;
cin >> school >> club >> ice_cream;
auto sum = school + club;
auto middle = sum >> 1;
if (middle == ice_cream) home = ice_cream;
else if (~sum & 1) home = middle;
else if (middle < ice_cream) home = middle + 1;
else home = middle;
distance = abs(ice_cream - home);
cout
Нурлан Ботагамитов
Нурлан Ботагамитов
57 417
Лучший ответ
Дмитрий Кувшинов На входных данных
 1 3 8 
даёт неверный ответ
 2 6 
 #include 
#include

using namespace std;

int main() {
long long A, B, d;
cin >> A >> B >> d;

long long sum = A + B;

// Берем среднее арифметическое двух введенных координат
long long house = sum / 2;

// Если сумма координат нечётное число, то дом может быть только на одной из двух соседних позиций
if (sum % 2 != 0) {
// Находим ближайший киоск для каждой координаты и выбираем ту, где расстояние до киоска меньше
long long kiosk1 = (house/d)*d;
long long kiosk2 = ((house + 1)/d)*d;
if(abs(kiosk1-house) >= abs(kiosk2-house+1))
house++;
}

// Расстояние до киоска с мороженым
long long kiosk = (house/d)*d;

// Защита от отрицательных расстояний
if(house < 0){
kiosk -= d;
}

cout
Сергей Es
Сергей Es
25 860
Игорь Хананов чушь и не твоя
Эта задача уже была, там же ответ дан.
Макс Антоненко Он только что ещё раз запостил этот вопрос. Зато выбирает лучшими ответы от нейросети с говнокодом, не имеющим ничего общего с условием задачи. Так что я ему ответов больше не пишу.
 
#include

using namespace std;

int max(int x, int y){
if(x > y){
return x;
}else{
return y;
}
}

int min(int x, int y){
if(x < y){
return x;
}else{
return y;
}
}

int twoPointers(string &vasya, int k, bool a){
int l, r, ans;
char atual = a? 'a':'b';

l = r = ans = 0;

while(r < vasya.size()){
if(vasya[r] == atual){
r++;
}
else{
if(k > 0){
r++;
k--;
}else{
l++;
if(vasya[l-1] != atual){
k++;
}
}
}
ans = max(ans,r-l);
}
return ans;
}

bool testa(int m, string &vasya, int k, bool a){
int l, r, nOutraLetra;
char atual = a? 'a':'b';

l = nOutraLetra = 0;
r = m-1;

for(int i=0; i < min(m, vasya.size()); i++){
if(vasya[i] != atual)nOutraLetra++;
}

if(nOutraLetra >k;
cin>>vasya;

cout
Арифметика остатков простейшая
СЕ
Сергей Есин
2 429
Держи
 #include    
#include

using namespace std;

int a = 10;
int b = 20;
int d = 15;
int ans, dist, l;

int ansf()
{
ans = (a + b) / 2;
return ans;
}
int distf()
{
l = ansf() % d;
dist = min(l, d-l);
if ((a + b) % 2) {
int dist1 = min(l+1,d-l-1);
if(dist > dist1) { ++ans; dist=dist1; }
}
return dist;
}
void main() {
cout
Я думаю ответ 8 или может красный
За деньги только если помочь
теряйся