Концептуальное объяснение решения с соответствующим кодом C++.

День 1, Часть 1

Проблема

Описание проблемы и пример ввода можно найти по адресу https://adventofcode.com/2022/day/1.

По сути, это группа эльфов. У каждого эльфа есть несколько порций еды, и каждая порция еды содержит определенное количество калорий. Мы хотим, чтобы у одного эльфа было максимальное количество калорий.

Вход

Нам дан ввод текста, как в примере ниже. Каждая строка ввода является либо пустой строкой, либо целым числом. Пустые строки отделяют каждого эльфа друг от друга, а целые числа представляют количество калорий для каждого кусочка еды.

В приведенном выше примере ввода

  • у эльфа 1 4+2 = 6 калорий
  • у эльфа 2 5+1+3 = 9 калорий
  • эльф 3 имеет 8 калорий

Таким образом, ответ равен 9.

Решение

Основная идея

Суммируйте калории каждого эльфа, отслеживая максимальное количество калорий во время ввода. Наконец, выведите максимальное количество калорий.

Концептуальное решение

Чтобы решить эту проблему, мы будем использовать две целочисленные переменные, max и cals, где

  • max = максимальная сумма калорий, которую держит один эльф
  • cals = текущая сумма калорий для всех кусочков еды одного эльфа.

Затем для каждого эльфа добавьте каждую калорию каждого кусочка еды к калориям.

Когда вы суммируете общее количество калорий для этого эльфа в cals, сравните cals с max и обновите max. соответственно.

Когда эльфов больше не останется, выведите значение max.

Код Решение

Вот код C++, соответствующий приведенному выше решению. Обратите внимание, что этот файл открывает входные данные из файла с именем day1.txt в папке с именем input.

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

void updateMax(int max, int cals) {
  if (cals > max) {
    max = cals;
  }
}

int main() {
  // track calorie sum and max
  int cals = 0;
  int max = 0;
  
  // get input through text file
  string line;
  ifstream file;
  file.open("input/day1.txt");
  while(getline(file, line)) {
    if (line != "") {  // if line isn't blank, then it is a number
      cals += stoi(line);  // convert line to int and add to cals
    } else {  // if line is blank, update max and reset cals
      updateMax(max, cals);
      cals = 0;
    }
  }
  cout << max << endl;
}

День 1, Часть 2

Проблема

Проблема для части 2 такая же, как и для части 1, за исключением того, что мы должны вернуть сумму 3 самых высоких максимальных значений калорий.

Решение

Концептуальное решение

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

  • изменить max с целого числа на вектор целых чисел
  • изменить реализацию updateMax()
  • измените наш оператор печати, чтобы вывести 3 самые высокие суммы калорий

Теперь наша функция updateMax() будет:

  • добавить текущую сумму калорий к max
  • отсортировать вектор max в порядке убывания
  • удалить последний элемент max

Код Решение

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

void updateMax(vector<int> max&, int cals) {
  max.push_back(cals);
  sort(max.begin(), max.end(), greater<int>());
  if (max.size() > 3) {
    max.pop_back();
  }
}

int main() {
  // track calorie sum and max
  int cals = 0;
  vector<int> max;
  
  // get input through text file
  string line;
  ifstream file;
  file.open("input/day1.txt");
  while(getline(file, line)) {
    if (line != "") {  // if line isn't blank, then it is a number
      cals += stoi(line);  // convert line to int and add to cals
    } else {  // if line is blank, update max and reset cals
      updateMax(max, cals);
      cals = 0;
    }
  }
  cout << max[0] + max[1] + max[2] << endl;
}

Тогда все готово. Вы можете увидеть код в моем репозитории GitHub.