Разлика сума до маx и од маx - Решење

Поставка

Директно решење

Решење до којег се најједноставније долази је да се масе свих предмета учитају у низ, да се након тога пронађе позиција највећег елемента у низу и да се затим одреди збир елемената низа пре те позиције и збир елемената низа после те позиције.

Оптимизовано решење

Задатак можемо решити и без коришћења низова. У овом решењу задатка ћемо комбиновати алгоритам одређивања максимума серије бројева и алгоритам сабирања серије учитаних бројева. У петљи ћемо учитавати једну по једну масу предмета, одржавајући при том збир маса пре прве појаве максималне масе, збир маса после прве појаве максималне масе и саму вредност максималне масе предмета.

На почетку учитавамо масу првог предмета (он постоји по условима задатка), максимум иницијализујемо на ту учитану вредност, а два збира на нулу (јер није виђен ни један предмет ни пре, ни после тог првог предмета који је уједно и прво појављивање до тада максималне масе).

Затим, у петљи учитавамо остале предмете, један по један. Могућа су два случаја.

Доказ коректности. Докажимо формално коректност овог алгоритма. Инваријанту петље чине следећи услови:

Докажимо да су услови заиста инваријанта петље.

На крају петље не важи да је \(i < n\), па пошто је \(i \leq n\), важи да је \(i=n\). Зато на основу инваријанте знамо да променљиве zbirPreMax zbirPosleMax заиста имају вредности збира свих елемената пре првог и после првог појављивања максималног елемента у делу низа \(a_0 \ldots a_{i-1}\), што је заправо цео низ (јер је \(i=n\), а \(n\) је укупан број елемената).

#include <iostream>
using namespace std;

int main() {
  // ukupan broj predmeta
  int n;
  cin >> n;

  // ucitavanje mase prvog predmeta
  int m;
  cin >> m;
  // najveca do sada ucitana masa
  int max = m;
  // zbir masa pre najvece do sada ucitane
  int zbirPreMax = 0;
  // zbir masa posle najvece do sada ucitane
  int zbirPosleMax = 0;
  for (int i = 1; i < n; i++) {
    // ucitavanje mase sledeceg predmeta
    cin >> m;
    if (m > max) {
      // korekcija najvece mase i zbirova
      zbirPreMax += max + zbirPosleMax;
      max = m;
      zbirPosleMax = 0;
    } else
      zbirPosleMax += m;
  }

  // prikaz rezultata
  cout << zbirPreMax - zbirPosleMax << endl;

  return 0;
}