Задания
Версия для печати и копирования в MS Word
Тип 27 № 40743
i

Дана по­сле­до­ва­тель­ность целых чисел. Не­об­хо­ди­мо найти мак­си­маль­но воз­мож­ную сумму её не­пре­рыв­ной под­по­сле­до­ва­тель­но­сти, в ко­то­рой ко­ли­че­ство по­ло­жи­тель­ных чётных эле­мен­тов крат­но k  =  30.

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

Файл A

Файл B

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число N  — общее ко­ли­че­ство чисел в на­бо­ре. Каж­дая из сле­ду­ю­щих N строк со­дер­жит одно число. Га­ран­ти­ру­ет­ся, что общая сумма любой вы­бор­ки за­дан­ных чисел не пре­вы­ша­ет 2 · 109 по аб­со­лют­ной ве­ли­чи­не.

Вам даны два вход­ных файла (A и B), каж­дый из ко­то­рых имеет опи­сан­ную выше струк­ту­ру. В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мой суммы для файла A, затем для файла B.

 

Ответ:

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

f = open("27-B.txt")

n = int(f.readline())

lefts = [0 for i in range(30)]

maxsum = 0

for i in range(30):

lefts[i] = 2 * 1000000000

count = 0

sum = 0

for i in range(1, n + 1):

num = int(f.readline())

sum = sum + num

if (num % 2 == 0) and (num > 0):

count = count + 1

d = count % 30

if sum < lefts[d]:

lefts[d] = sum

maxsum = max(maxsum, sum - lefts[d])

print(maxsum)

 

Ответ: 97011  24932.

 

При­ме­ча­ние.

Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

При­ведём дру­гое ре­ше­ние.

Для на­хож­де­ния ис­ко­мой суммы найдём сумму всех чисел в файле и, если ко­ли­че­ство чётных по­ло­жи­тель­ных чисел этой суммы не будет крат­но 30, вы­чтем из этой суммы число, яв­ля­ю­ще­е­ся ми­ни­маль­ной под­сум­мой чисел с таким же ко­ли­че­ством чётных по­ло­жи­тель­ных чисел, крат­ных 30, как и у суммы всех чисел в файле.

Будем по­сле­до­ва­тель­но счи­ты­вать числа из файла. В мас­сив lefts будем за­пи­сы­вать пер­вые встре­ча­ю­щи­е­ся суммы с ко­ли­че­ством чётных эле­мен­тов, де­ля­щим­ся на 30 с остат­ком от нуля до два­дца­ти де­вя­ти. Каж­дое счи­тан­ное число будем при­бав­лять к пе­ре­мен­ной sum. Если оче­ред­ное встре­чен­ное число яв­ля­ет­ся чётным и по­ло­жи­тель­ным, будем уве­ли­чи­вать зна­че­ние счётчика count. Каж­дую ите­ра­цию цикла будем про­ве­рять, боль­ше ли те­ку­щая мак­си­маль­ная сумма в пе­ре­мен­ной maxsum боль­ше зна­че­ния вы­ра­же­ния sum − lefts[d] (в этом вы­ра­же­нии по­лу­ча­ем зна­че­ние новой под­сум­мы, с ко­ли­че­ством чётных по­ло­жи­тель­ных чисел крат­ным 30). Если зна­че­ние пе­ре­мен­ной maxsum мень­ше  — об­нов­ля­ем её зна­че­ние.

 

При­ведём ре­ше­ние за­да­чи на языке Pascal.

var

i, n, num, count, d: integer;

sum, maxsum: int64;

lefts: array[0..29] of int64;

f: text;

begin

assign(f,'C:\27-B.txt');

reset(f);

readln(f, n);

for i := 0 to 29 do begin

lefts[i] := 2 * 1000000000;

end;

count := 0;

sum := 0;

for i := 1 to n do begin

readln(f, num);

sum := sum + num;

if (num mod 2 = 0) and (num > 0) then count := count + 1;

d := count mod 30;

if sum < lefts[d] then lefts[d] := sum;

maxsum := Max(maxsum, sum - lefts[d]);

end;

writeln(maxsum);

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла A ответ  — 97011, из файла B  — 24932.


Аналоги к заданию № 38961: 39256 40743 41002 Все