Метро

      Комментарии к записи Метро отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 4 мес., 2 нед. назад.

  • Автор
    Сообщения
  • #3402

    Задача взята с acmp.ru:

    Витя работает недалеко от одной из станций кольцевой линии метро, а живет рядом с другой станцией той же линии. Требуется выяснить, мимо какого наименьшего количества промежуточных станций необходимо проехать Вите по кольцу, чтобы добраться с работы домой.

    Входные данные
    Во входном файле INPUT.TXT заданы три числа: сначала N – общее количество станций кольцевой линии, а затем i и j – номера станции, на которой Витя садится, и станции, на которой он должен выйти. Станции пронумерованы подряд натуральными числами 1, 2, 3, …, N (1-я станция – соседняя с N-й), N не превосходит 100. Числа i и j не совпадают. Все числа разделены пробелом.

    Выходные данные
    В выходной файл OUTPUT.TXT требуется вывести минимальное количество промежуточных станций (не считая станции посадки и высадки), которые необходимо проехать Вите.

    Примеры

    INPUT.TXTOUTPUT.TXT
    1100 5 60
    210 1 91

    Разбор решения задачи

    Вычисления необходимые для определения минимального количества станций, которые необходимо проехать Вите:

    1. a=N-j разность между общим количеством станций и станцией, на которой Витя работает;
    2. b=N-i разность между общим количеством станций и станцией, на которой Витя живет;
    3. c=j-i разность между номерами станций , на которых Витя работает и живет.

    Алгоритм решения можно изобразить следующей блок-схемой:

    Исходный код решения на языке С++:

    #include<iostream>
    #include<fstream>
    using namespace std;
    
    int main() {
      ifstream cin("input.txt");
      ofstream cout("output.txt");
    
      int N,i,j,a=0,b=0,c=0;
      cin>>N>>i>>j;
    
      a=N-j;
      b=N-i;
      c=j-i;
    
      if (i<j) {
        if (c<(a+i))
          cout<<c-1;
        else
          cout<<a+i-1;
      }
      else {
        if (c<(b+j))
          cout<<c-1;
        else
          cout<<b+j-1;
      }
    }

    Расчет минимального количества станций, которые должен проехать Витя, осуществляется при помощи условия (if) и выполнения определенных расчетов, которые определены для каждой части условия. Вначале идет сравнение номеров станций, на которых Витя садится и где должен выйти. (Номер станции, на которой живет меньше номера станции, на которой работает (да/нет)).

    Если номер станции, на которой живет, меньше номера станции на которой работает, то проверяется условие с<(a+i). (Линия метро кольцевая, можно выбрать оптимальный вариант, в каком направлении поехать).

    Если условие выполняется, то в output.txt выводится разность между номером станции, на которой Витя работает и номером, станции, на которой Витя живет и еще вычитается единица, так как по условию задачи нужно только количество промежуточных станций.

    Если условие не выполняется, то в output.txt выводится a+i-1.

    Если номер станции, на которой живет, больше номера станции, на которой работает, то проверяется условие с<(b+j). (Линия метро кольцевая, можно выбрать оптимальный вариант, в каком ехать направлении).

    Если условие выполняется, то в output.txt выводится разность между номером станции, на которой Витя работает и номером, станции, на которой Витя живет и еще вычитается единица, так как по условию задачи нужно только количество промежуточных станций.

    Если условие не выполняется, то в output.txt выводится b+j-1.

Для ответа в этой теме необходимо авторизоваться.