Задания
Версия для печати и копирования в MS Word

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

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

Файл 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(10)]

rights = [0 for i in range(10)]

for i in range(10):

lefts[i] = 0

rights[i] = 0

count = 0

sum = 0

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

num = int(f.readline())

sum = sum + num

if num % 2 == 0:

count = count + 1

d = count % 10

if lefts[d] == 0:

lefts[d] = sum

rights[d] = sum

maxsum = 0

if count % 10 == 0:

print(sum)

else:

for i in range(1, count % 10 + 1):

if (rights[i] - lefts[i]) > maxsum:

maxsum = rights[i] - lefts[i]

if rights[0] > maxsum:

maxsum = rights[0]

print(maxsum)

 

Ответ: 4779554  979258630.

 

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

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

 

При­ведём ре­ше­ние Мат­вея Кур­чен­ко на языке Python.

f = [int(i) for i in open('27.txt')]

a = [-1] + [i-1 for i in range(1, f[0]+1) if f[i]%2 == 0] + [-1]

mx = 0

for i in range(1, (len(a)%10)):

mx = max(mx, sum(f[1:][a[i - 1] + 1:a[-(len(a)%10) + i]]))

print(mx)

 

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

Будем по­сле­до­ва­тель­но счи­ты­вать числа из файла. В мас­сив lefts будем за­пи­сы­вать пер­вые встре­ча­ю­щи­е­ся суммы с ко­ли­че­ством чётных эле­мен­тов, де­ля­щим­ся на 10 с остат­ком от нуля до де­вя­ти. В мас­сив rights также будем за­пи­сы­вать суммы с ко­ли­че­ством чётных эле­мен­тов, де­ля­щим­ся на 10 с остат­ком от нуля до де­вя­ти. Если будет встре­че­но не­сколь­ко сумм с одним и тем же остат­ком, в мас­сив rights будет за­пи­са­на сумма, встре­тив­ша­я­ся позже. Если после счи­ты­ва­ния всех чисел из файла зна­че­ние в пе­ре­мен­ной count не крат­но 10, тогда будем про­ве­рять раз­но­сти эле­мен­тов мас­си­вов rights и lefts с со­от­вет­ству­ю­щи­ми ин­дек­са­ми и вы­во­дить на экран наи­боль­шую из таких раз­но­стей  — это и будет ис­ко­мой мак­си­маль­ной сум­мой.

 

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

var

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

sum, maxsum: int64;

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

rights: array[0..9] of int64;

f: text;

begin

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

reset(f);

readln(f, n);

for i := 0 to 9 do begin

lefts[i] := 0;

rights[i] := 0;

end;

count := 0;

sum := 0;

for i := 1 to n do begin

readln(f, num);

sum := sum + num;

if num mod 2 = 0 then count := count + 1;

d := count mod 10;

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

rights[d] := sum;

end;

maxsum := 0;

if count mod 10 = 0 then writeln(sum)

else for i := 1 to (count mod 10) do

if (rights[i] - lefts[i]) > maxsum then maxsum := rights[i] - lefts[i];

if rights[0] > maxsum then maxsum := rights[0];

writeln(maxsum);

end.

 

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


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

Раздел кодификатора ФИПИ: