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

Име­ет­ся набор дан­ных, со­сто­я­щий из пар по­ло­жи­тель­ных целых чисел. Не­об­хо­ди­мо вы­брать из каж­дой пары ровно одно число так, чтобы сумма всех вы­бран­ных чисел не де­ли­лась на 3 и при этом была мак­си­маль­но воз­мож­ной. Га­ран­ти­ру­ет­ся, что ис­ко­мую сумму по­лу­чить можно. Про­грам­ма долж­на на­пе­ча­тать одно число  — мак­си­маль­но воз­мож­ную сумму, со­от­вет­ству­ю­щую усло­ви­ям за­да­чи.

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

Файл A

Файл B

Даны два вход­ных файла (файл A и файл B), каж­дый из ко­то­рых со­дер­жит в пер­вой стро­ке ко­ли­че­ство пар N (1 ≤ N ≤ 100 000). Каж­дая из сле­ду­ю­щих N строк со­дер­жит два на­ту­раль­ных числа, не пре­вы­ша­ю­щих 10 000.

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

6

1 3

5 12

6 9

5 4

3 3

1 1

Для ука­зан­ных вход­ных дан­ных зна­че­ни­ем ис­ко­мой суммы долж­но быть число 32.

В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мой суммы для файла А, затем для файла B.

 

Пре­ду­пре­жде­ние: для об­ра­бот­ки файла B не сле­ду­ет ис­поль­зо­вать пе­ре­бор­ный ал­го­ритм, вы­чис­ля­ю­щий сумму для всех воз­мож­ных ва­ри­ан­тов, по­сколь­ку на­пи­сан­ная по та­ко­му ал­го­рит­му про­грам­ма будет вы­пол­нять­ся слиш­ком долго.

 

Ответ:

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

Ре­ше­ние.

По­сле­до­ва­тель­но счи­ты­вая дан­ные из файла, будем при­бав­лять к сумме мак­си­маль­ное число в паре. Также за­ме­тим, что в слу­чае, если по­лу­чив­ше­е­ся в ре­зуль­та­те сум­ми­ро­ва­ния мак­си­маль­ных чисел во всех парах число будет крат­но трём, до­ста­точ­но будет вы­честь из этой суммы ми­ни­маль­ную раз­ни­цу между ка­ки­ми-⁠либо двумя чис­ла­ми. Для этого при счи­ты­ва­нии пар по­ми­мо мак­си­маль­но­го числа в каж­дой паре будем ис­кать ми­ни­маль­ную раз­ни­цу среди пар, не крат­ную трём.

 

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

var

x, y: longint;

n: longint;

sum: longint;

mindif: longint;

f: text;

begin

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

reset(f);

readln(f, n);

sum := 0;

mindif := 20001;

while not eof(f) do begin

readln(f, x, y);

if x > y then

sum := sum + x

else

sum := sum + y;

if (abs(x - y) < mindif) and (abs(x-y) mod 3 <> 0) then mindif := abs(x-y);

end;

if sum mod 3 <> 0 then

writeln(sum)

else

writeln(sum - mindif);

end.

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

 

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

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

 

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

f = open("27-B_demo (2).txt") # для файла A за­ме­ни­те на­зва­ние

s = f.readlines()

n = int(s[0]) # ко­ли­че­ство пар

summi = 0

d = 10**6

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

x, y = map(int, s[i].split())

summi += max(x, y)

if abs(x - y) % 3 != 0:

d = min(d, abs(x - y))

if summi % 3 != 0:

print(summi)

else:

print(summi - d)

 

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

a=[list(map(int,s.split())) for s in open('27-B_demo.txt')][1:]

s=sum([max(x) for x in a])

d=min([abs(x[0]-x[1]) for x in a if (x[0]-x[1])%3!=0])

print(s if s%3!=0 else s-d)


Аналоги к заданию № 27424: 27889 27890 Все

Источник: Де­мон­стра­ци­он­ная вер­сия ЕГЭ−2021 по ин­фор­ма­ти­ке
Раздел кодификатора ФИПИ: