Top.Mail.Ru
Ответы

Прошу быстрее!!! Задача на C++

Родители Лизы подключили пакет, содержащий N телевизионных каналов, пронумерованных числами от 1 до N.
Переключать каналы можно с помощью двух кнопок на пульте: «+» и «–».
Короткое нажатие на кнопку «+» приведёт к переключению на следующий канал, если номер текущего канала меньше N; если же номер текущего канала равен N, то телевизор продолжит показывать этот канал. Если кнопку «+» нажать и удерживать некоторое время, произойдёт переход на K каналов вперёд, при условии, что номер текущего канала не превосходит N – K. В противном случае произойдёт переход на канал N.
Аналогично, короткое нажатие на кнопку «–» приведёт к переключению на предыдущий канал, если номер текущего канала больше 1; если же номер текущего канала равен 1, телевизор продолжит показывать этот канал. Если кнопку «–» нажать и удерживать некоторое время, то произойдёт переход на K каналов назад при условии, что номер текущего канала превышает K. В противном случае произойдёт переход на канал 1.
Лиза включила телевизор и обнаружила, что он показывает канал P. Лиза знает, что очень скоро по каналу с номером U начнётся интересная передача. Определите, какое минимальное количество нажатий на кнопки пульта потребуется сделать Лизе, чтобы переключиться на канал U.
Формат выходных данных

В первой строке содержится целое число N (3 ≤ N ≤ 109) — количество телевизионных каналов.

Во второй строке содержится целое число K (2 ≤ K < N) — количество каналов, на которое осуществится переход назад или вперёд при удерживании соответствующей кнопки переключения.

В третьей строке содержится целое число P (1 ≤ P ≤ N) — номер канала, который показывает телевизор.
В четвёртой строке содержится целое число U (1 ≤ U ≤ N) — номер канала, на который желает переключиться Лиза.
Гарантируется, что P ≠ U.
Формат выходных данных

Выведите одно целое неотрицательное число — минимальное количество нажатий на кнопки пульта, которое необходимо для переключения с канала P на канал U.


По дате
По Рейтингу
Аватар пользователя
Мастер

Странно что такую интересную задачку никто не порешал.
Вот мой вариант решения, надеюсь не слишком поздно.

12345678910111213141516171819202122232425
 #include<cmath> 
#include <iostream> 
 
//dist1 - расстояние до промежуточной точки в которой меняется кратность
//dist2 - расстояние от променжуточной до финальной точки
// k - шаг
int path(int dist1, int dist2, int k ){ 
  return dist1/k + (dist1%k==0?0:1) + dist2/k+ std::min( dist2%k, 1+k-dist2%k);  
} 
 
int save_the_world(int n, int s, int p, int k){ 
  if(s>p ) std::swap(s,p);  // чтобы не считать абсолютные пути
  if(s==p) return 0; 
  int direct = path(0  ,p-s,k);  
  int via1   = path(s-1,p-1,k); 
  int viaN   = path(n-s,n-p,k); 
  return std::min(std::min(direct,via1),viaN); 
}

int main(){
  int N, K ,P,U;
  std::cin >> N>>K>>P>>U;
  std::cout << save_the_world(N,P,U,K);
  return 0;
} 
Аватар пользователя
Высший разум

Быстрее чата общеизвестного нет. А я даже читать это не хочу, так как длинные задания тут редко кто читает.