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

На вход про­грам­мы по­сту­па­ет по­сле­до­ва­тель­ность из целых по­ло­жи­тель­ных чисел. Не­об­хо­ди­мо вы­брать такую под­по­сле­до­ва­тель­ность под­ряд иду­щих чисел, чтобы их сумма была мак­си­маль­ной и де­ли­лась на 89, а также её длину. Если таких под­по­сле­до­ва­тель­но­стей не­сколь­ко, вы­брать такую, у ко­то­рой длина мень­ше.

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

Файл A

Файл B

Даны два вход­ных файла (файл A и файл B), каж­дый из ко­то­рых со­дер­жит в пер­вой стро­ке ко­ли­че­ство чисел N (2 ≤ N ≤ 68000). В каж­дой из по­сле­ду­ю­щих N строк за­пи­са­но одно целое по­ло­жи­тель­ное число, не пре­вы­ша­ю­щее 10000. Про­грам­ма долж­на вы­ве­сти длину най­ден­ной по­сле­до­ва­тель­но­сти.

При­мер вход­но­го файла:

8

2

3

4

93

42

34

5

95

Для де­ли­те­ля 50 при ука­зан­ных вход­ных дан­ных зна­че­ни­ем ис­ко­мой суммы долж­но быть число 100 (3 + 4 + 93 или 5 + 95). Сле­до­ва­тель­но, ответ на за­да­чу  — 2. В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мой длины для файла A, затем для файла B.

 

Ответ:

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

Ре­ше­ние.

Пе­ре­би­ра­ем все воз­мож­ные суммы, ко­то­рые на­чи­на­ют­ся на i-⁠том эле­мен­те и за­кан­чи­ва­ют­ся на j-⁠том эле­мен­те. Нашли бОль­шую сумму  — об­но­ви­ли ms (макс. сумму) и m (мин. длину). Нашли такую же сумму, как уже най­ден­ная мак­си­маль­ная,  — об­но­ви­ли m при не­об­хо­ди­мо­сти.

 

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

f = open('27_B.txt')

n = int(f.readline())

nums = list(map(int, f.readlines()[:n]))

m, ms = float('inf'), 0

for i in range(len(nums)):

    for j in range(i, len(nums)):

        s = sum(nums[i:j + 1])

        if s % 89 == 0 and s > ms:

            ms, m = s, j - i + 1

        if s % 89 == 0 and s == ms:

            m = min(m, j - i + 1)

print(m)

 

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

f = open('27_B.txt')

k, s = 89, 0

mins = {0: (0, 0)}

res = []

for i in range(1, int(f.readline())+1):

    s += int(f.readline())

    if s % k in mins:

        res += [(s - mins[s % k][0], mins[s % k][1] – i)]

    else:

        mins[s % k] = (s, i)

print(-max(res)[1])

 

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

f = open('27_B.txt')

n = int(f.readline())

k = 89

r = {0: (0, 0)}

ms = 0

m = float('inf')

for _ in range(n):

    x = int(f.readline())

    t = {}

    for key in r:

        t[(key+x) % k] = (r[key][0] + x, r[key][1] + 1)

    if x % k not in t:

        t[x % k] = (x, 1)

    r = t.copy()

    if 0 in r:

        if ms < r[0][0]:

            ms = r[0][0]

            m = r[0][1]

        elif ms == r[0][0]:

            m = min(t[0][1], m)

print(m)

 

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

a = [int(s) for s in open('27_B.txt')][1:]

p = 0

b = [0]

nk = [[0]] + [[] for _ in range(88)]

for i in range(len(a)):

p += a[i]

b.append(p)

r = p%89

if len(nk[r]) < 2: nk[r].append(i+1)

else: nk[r][1] = i+1

r = sorted([(b[x[1]]-b[x[0]],x[0]-x[1]) for x in nk if len(x) == 2],reverse=True)

print(-r[0][1])

 

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

var

i, d: longint;

n: longint;

mins: array [0..88] of longint;

minl: array [0..88] of longint;

sum, maxsum, minlen, num, ms, l: longint;

f: text;

begin

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

reset(f);

readln(f, n);

for i := 0 to 88 do mins[i] := 1000000001;

for i := 0 to 88 do minl[i] := 0;

sum := 0;

maxsum := 0;

minlen := 0;

ms := 0;

l := 0;

for i := 1 to n do begin

readln(f, num);

sum := sum + num;

d := sum mod 89;

if d = 0 then begin

maxsum := sum;

minlen := i;

end

else begin

ms := sum - mins[d];

l := i - minl[d];

if ms > maxsum then begin

maxsum := ms;

minlen := l;

end;

if (ms = maxsum) and (l < minlen) then begin

maxsum := ms;

minlen := l;

end;

end;

if sum < mins[d] then begin

mins[d] := sum;

minl[d] := i;

end;

end;

writeln(minlen);

end.

 

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

 

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

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

Источник: ЕГЭ по ин­фор­ма­ти­ке 24.06.2021. Ос­нов­ная волна
Раздел кодификатора ФИПИ: