Разбор олимпиадной задачи — Арбузы

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

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

      Иван Васильевич пришел на рынок и решил купить два арбуза: один для себя, а другой для тещи. Понятно, что для себя нужно выбрать арбуз потяжелей, а для тещи полегче. Но вот незадача: арбузов слишком много и он не знает как же выбрать самый легкий и самый тяжелый арбуз? Помогите ему!

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

      В первой строке входного файла INPUT.TXT задано одно число N – количество арбузов. Вторая строка содержит N чисел, записанных через пробел. Здесь каждое число – это масса соответствующего арбуза. Все числа натуральные и не превышают 30000.

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

      В выходной файл OUTPUT.TXT нужно вывести два числа через пробел: массу арбуза, который Иван Васильевич купит теще и массу арбуза, который он купит себе.

      Примеры

      INPUT.TXT OUTPUT.TXT
      1 5
      5 1 6 5 9
      1 9

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

      В этой задаче нужно найти минимум и максимум в массиве. Первый вариант — считываем массив с файла, руками пишем вычисление минимума и максимума:

      #include <fstream>
      #include <vector>
      using namespace std;
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        int n;
        ifst >> n;
      
        vector<int> melons(n);
        for (int i = 0; i < n; ++i) {
          ifst >> melons[i];
        }
      
        int min = melons[0], max = melons[0];
        for (int i = 0; i < n; ++i) {
          if (melons[i] < min)
            min = melons[i];
      
          if (melons[i] > max)
            max = melons[i];
        }
      
        ofst << min << " " << max;
      }

      Этот код можно улучшить, ведь в стандартной библиотеке есть функции min_element и max_element (а еще — minmax_element, который за один проход по массиву вычислит максимум и минимум):

      #include <fstream>
      #include <vector>
      #include <algorithm>
      using namespace std;
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        int n;
        ifst >> n;
      
        vector<int> melons(n);
        for (int i = 0; i < n; ++i) {
          ifst >> melons[i];
        }
      
        ofst << *min_element(melons.begin(), melons.end()) << " " <<
                *max_element(melons.begin(), melons.end());
      }
      

      Однако, этот код можно еще улучшить. Ведь чтобы найти максимум и минимум нам не обязательно считывать содержимое файла в массив. Также, обратите внимание на использование встроенных функций min и max — они сильно упрощают чтение исходного кода:

      #include <fstream>
      using namespace std;
      
      int main() {
        ifstream ifst("input.txt");
        ofstream ofst("output.txt");
      
        int n, min_value, max_value, element;
      
        ifst >> n >> element;
        min_value = max_value = element;
      
        for (int i = 1; i < n; ++i) {
          ifst >> element;
          min_value = min(min_value, element);
          max_value = max(max_value, element);
        }
      
        ofst << min_value << " " << max_value;
      }

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