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

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

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

Файл A

Файл B

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

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

6

1 3

5 12

6 9

5 4

3 3

1 1

Для ука­зан­ных дан­ных ис­ко­мая сумма равна 21.

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

 

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

 

Ответ:

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

Ре­ше­ние.

По­сле­до­ва­тель­но счи­ты­вая дан­ные из файла, будем при­бав­лять к сумме ми­ни­маль­ное число в паре. Если сумма чисел де­лит­ся на 3 с остат­ком 1, то, чтобы она де­ли­лась на 3, к этой сумме не­об­хо­ди­мо при­ба­вить либо раз­ни­цу между чис­ла­ми в паре, де­ля­щу­ю­ся на 3 с остат­ком 2, либо два раза при­ба­вить к этой сумме раз­ни­цу между чис­ла­ми в паре, де­ля­щу­ю­ся на 3 с остат­ком 1. Также за­ме­тим, что если сумма чисел де­лит­ся на 3 с остат­ком 2, то, чтобы она де­ли­лась на 3, к этой сумме не­об­хо­ди­мо либо при­ба­вить раз­ни­цу между чис­ла­ми в паре, де­ля­щу­ю­ся на 3 с остат­ком 1, либо два раза при­ба­вить к этой сумме раз­ни­цу между чис­ла­ми в паре, де­ля­щу­ю­ся на 3 с остат­ком 2. Зна­чит, не­об­хо­ди­мо ис­кать два числа, де­ля­щих­ся на 3 с остат­ком 1 и яв­ля­ю­щих­ся ми­ни­маль­ны­ми раз­ни­ца­ми между чис­ла­ми в парах, и два числа, де­ля­щих­ся на 3 с остат­ком 2 и яв­ля­ю­щих­ся ми­ни­маль­ны­ми раз­ни­ца­ми между чис­ла­ми в парах.

 

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

var

x, y: integer;

n: integer;

sum: integer;

dif1, dif2, dif3, dif4: integer;

f: text;

begin

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

reset(f);

readln(f, n);

sum := 0;

dif1 := 20001;

dif2 := 20001;

dif3 := 20001;

dif4 := 20001;

while not eof(f) do begin

readln(f, x, y);

if x > y then

sum := sum + y

else

sum := sum + x;

if (abs(x-y) mod 3 = 1) and (abs(x-y) < dif1) then begin

dif2 := dif1;

dif1 := abs(x-y);

end

else if (abs(x-y) mod 3 = 1) and (abs(x-y) < dif2) then

dif2 := abs(x-y)

else if (abs(x-y) mod 3 = 2) and (abs(x-y) < dif3) then begin

dif4 := dif3;

dif3 := abs(x-y);

end

else if (abs(x-y) mod 3 = 2) and (abs(x-y) < dif4) then

dif4 := abs(x-y);

end;

if sum mod 3 = 0 then

writeln(sum)

else if (sum mod 3 = 1) then

if ((sum + dif3) < (sum + dif1 + dif2)) then

writeln(sum + dif3)

else

writeln(sum + dif1 + dif2)

else if (sum mod 3 = 2) then

if ((sum + dif1) < (sum + dif3 + dif4)) then

writeln(sum + dif1)

else

writeln(sum + dif3 + dif4)

end.

 

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

 

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

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

 

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

f = open("inf_22_10_20_27b.txt")

s = f.readlines()

n = int(s[0])

sum = 0

dif1 = 20001

dif2 = 20001

dif3 = 20001

dif4 = 20001

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

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

if x > y: sum += y

else: sum += x

if (abs(x-y) % 3 == 1) and (abs(x-y) < dif1):

dif2 = dif1

dif1 = abs(x - y)

elif (abs(x-y) % 3 == 1) and (abs(x-y) < dif2): dif2 = abs(x-y)

elif (abs(x-y) % 3 == 2) and (abs(x-y) < dif3):

dif4 = dif3

dif3 = abs(x - y)

elif (abs(x-y) % 3 == 2) and (abs(x-y) < dif4): dif4 = abs(x-y)

if sum % 3 == 0:

print(sum)

elif sum % 3 == 1:

if (sum + dif3) < (sum + dif1 + dif2):

print(sum + dif3)

else: print(sum + dif1 + dif2)

elif sum % 3 == 2:

if ((sum + dif1) < (sum + dif3 + dif4)):

print(sum + dif1)

else:

print(sum + dif3 + dif4)


Аналоги к заданию № 29675: 33106 Все

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