Разбор acmp — Автобусная экскурсия

  • В этой теме 0 ответов, 1 участник, последнее обновление 4 месяца, 3 недели назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6454
      @admin
      StudLance.ru

      Условие задачи взято с сайта acmp.ru (Время: 1 сек. Память: 16 Мб Сложность: 14%):

      Оргкомитет Московской городской олимпиады решил организовать обзорную экскурсию по Москве для участников олимпиады. Для этого был заказан двухэтажный автобус (участников олимпиады достаточно много и в обычный они не умещаются) высотой 437 сантиметров. На экскурсионном маршруте встречаются N мостов. Жюри и оргкомитет олимпиады очень обеспокоены тем, что высокий двухэтажный автобус может не проехать под одним из них. Им удалось выяснить точную высоту каждого из мостов. Автобус может проехать под мостом тогда и только тогда, когда высота моста превосходит высоту автобуса.

      Помогите организаторам узнать, закончится ли экскурсия благополучно, а если нет, то установить, где произойдет авария.

      Входные данные

      Во входном файле INPUT.TXT сначала содержится число N (1 ≤ N ≤ 1000). Далее идут N натуральных чисел, не превосходящих 10000 — высоты мостов в сантиметрах в том порядке, в котором они встречаются на пути автобуса.

      Выходные данные

      В единственную строку выходного файла OUTPUT.TXT нужно вывести фразу «No crash», если экскурсия закончится благополучно. Если же произойдет авария, то нужно вывести сообщение «Crash k», где k — номер моста, где произойдет авария. Фразы выводить без кавычек ровно с одним пробелом внутри.

      Примеры

      INPUT.TXT OUTPUT.TXT
      1 1
      763
      No crash
      2 3
      763 245 113
      Crash 2
      3 1
      437
      Crash 1

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

      Это хорошая практика на тему «Циклы«, но мы также поупражняемся в использовании стандартной библиотеки STL C++.

      В задаче требуется проверить есть ли в файле хоть одно число, меньшее чем 437. Очевидное решение — считываем по очереди числа, сравниваем, выводим результат:

      #include <fstream>
      
      using namespace std;
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        const int bus_height = 437;
      
        int n, bridge_height;
        ifst >> n;
      
        for(int bridge_id = 1; bridge_id <= n; ++bridge_id) {
          ifst >> bridge_height;
          if(bus_height >= bridge_height) {
            ofst << "Crash " << bridge_id;
            return 0;
          }
        }
      
        ofst << "No crash";
      }

      Чтобы потренироваться в использовании стандартной библиотеки — считаем содержимое файла в вектор — при этом можно использовать алгоритм copy и итераторы файловых потоков, проверим наличие низкого моста с помощью стандартного алгоритма find_if и, наконец, вычислим номер моста с помощью алгоритма distance:

      #include <fstream>
      #include <vector>
      #include <iterator>
      #include <algorithm>
      using namespace std;
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        int n;
        ifst >> n;
      
        vector<int> bridges;
        std::copy(istream_iterator<int>(ifst), istream_iterator<int>(), back_inserter(bridges));
      
        auto crash_it = find_if(bridges.begin(), bridges.end(), [](int bridge_height) {
          static const int bus_height = 437;
          return bus_height >= bridge_height;
        });
      
        if (crash_it == bridges.end())
          ofst << "No crash";
        else
          ofst << "Crash " << distance(bridges.begin(), crash_it) + 1;
      }

      StudLance.ru

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