Первая строка входного файла содержит n – количество чисел (1 <= n <= 1000). Во второй строке задаются n чисел, каждое из которых по модулю не превосходит 1000 000 000. Выведите минимальную сумму подряд идущих чисел. - Pascal(Паскаль)

Например

Входной файл:
7
-5 10 -2 -3 4 -7 1

Выходной файл:
-8

Комментарий - Минимальная сумма подряд идущих чисел начинается с позиции 3 и заканчивается позицией 6: (-2) + (-3) + 4 + (-7) = -8
procedure TForm1.Button1Click(Sender: TObject);
const
  //Множество разделителей.
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
  //Величина приращения длины динамического массива.
  Capacity = 10;
var
  Arr : array of Extended;
  S : String;
  i, j, k, Len, Pos1 : Integer;
  Sum, SumMin : Extended;
begin
  //Выделяем числа из текста и формируем массив.
  S := Memo1.Text;
  Len := Length(S);
  Pos1 := 0;
  j := 0;
  for i := 1 to Len do begin
    //Пропускаем разделители.
    if S[i] in D then Continue;
    //Отслеживаем начало записи числа.
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    //Отслеживаем конец записи числа.
    if (i = Len) or (S[i + 1] in D) then begin
      //Если требуется, увеличиваем длину массива.
      if j = Length(Arr) then SetLength(Arr, j + Capacity);
      //Добавляем новый элемент в массив.
      Arr[j] := StrToFloat( Copy(S, Pos1, i - Pos1 + 1) );
      //Индекс следующего элемента массива.
      Inc(j);
    end;
  end;
  //Изменяем длину массива в соответствие
  //с количеством добавленных в него элементов.
  if j < Length(Arr) then SetLength(Arr, j);
  //Если массив пуст.
  if j = 0 then begin
    ShowMessage('В тексте числа не найдены. Действие отменно.');
    Exit;
  end;
 
  //Поиск минимальной суммы последовательно идущих чисел.
  SumMin := Arr[0];
  for i := 0 to High(Arr) do
  for j := i to High(Arr) do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
  //Ответ.
  ShowMessage('Минимальная сумма: ' + FloatToStr(SumMin));
end;
program Project1;
 
const
  //Множество разделителей.
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
  //Длина массива.
  N = 100;
var
  Arr : array[1..N] of Extended;
  //Если нужен массив целых чисел:
  //Arr : array[1..N] of Integer;
  S : String;
  i, j, k, Cnt, Len, Pos1 : Integer;
  Sum, SumMin : Extended;
  //Если используем массив целых чисел:
  //Sum, SumMin : Integer;
begin
  Writeln('Задайте последовательность чисел в виде строки:');
  Readln(S);
 
  //Выделяем числа из текста и формируем массив.
  Len := Length(S);
  Pos1 := 0;
  Cnt := 0;
  for i := 1 to Len do begin
    //Пропускаем разделители.
    if S[i] in D then Continue;
    //Отслеживаем начало записи числа.
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    //Отслеживаем конец записи числа.
    if (i = Len) or (S[i + 1] in D) then begin
      //Индекс текущего элемента массива.
      Inc(Cnt);
      //Добавляем новый элемент в массив.
      Val( Copy(S, Pos1, i - Pos1 + 1), Arr[Cnt], j );
    end;
  end;
 
  //Поиск минимальной суммы последовательно идущих чисел.
  SumMin := 0;
  if Cnt > 0 then SumMin := Arr[1];
  for i := 1 to Cnt do
  for j := i to Cnt do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
  //Ответ.
  if Cnt > 0 then
    Writeln('Минимальная сумма: ', SumMin)
  else
    Writeln('В тексте числа не обнаружены.')
  ;
  Readln;
end.

Leave a Comment

90 − = 85