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

В файле со­дер­жит­ся по­сле­до­ва­тель­ность из 10 000 на­ту­раль­ных чисел. Каж­дое число не пре­вы­ша­ет 10 000. Опре­де­ли­те и за­пи­ши­те в от­ве­те сна­ча­ла ко­ли­че­ство пар эле­мен­тов по­сле­до­ва­тель­но­сти, у ко­то­рых раз­лич­ные остат­ки от де­ле­ния на d  =  160 и хотя бы одно из чисел де­лит­ся на p  =  7, затем мак­си­маль­ную из сумм эле­мен­тов таких пар. В дан­ной за­да­че под парой под­ра­зу­ме­ва­ет­ся два раз­лич­ных эле­мен­та по­сле­до­ва­тель­но­сти. По­ря­док эле­мен­тов в паре не важен.

При­мер вход­ных дан­ных:

168

7

320

328

При­мер вы­ход­ных дан­ных для при­ведённого выше при­ме­ра вход­ных дан­ных:

4 488

По­яс­не­ние. Из 4 чисел можно со­ста­вить 6 пар. В дан­ном слу­чае усло­ви­ям удо­вле­тво­ря­ют пары: 168 и 320, 168 и 7, 320 и 7, 328 и 7. Мак­си­маль­ную сумму дает пара 168 и 320  — 488.

За­да­ние 17

Ответ:

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

Ре­ше­ние.

Сна­ча­ла счи­та­ем все числа из файла в мас­сив. Для каж­дой пары будем про­ве­рять, де­лит­ся ли хотя бы одно число из пары на 7, а также то, имеют ли эле­мен­ты пары раз­лич­ные остат­ки от де­ле­ния на 160. При успеш­ном вы­пол­не­нии усло­вия будем уве­ли­чи­вать зна­че­ния счётчика count и про­ве­рять, боль­ше ли сумма эле­мен­тов пары те­ку­щей мак­си­маль­ной суммы. Если сумма эле­мен­тов пары боль­ше те­ку­щей мак­си­маль­ной суммы, будем об­нов­лять зна­че­ние пе­ре­мен­ной maxsum.

 

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

var

i, j: integer;

count: longint;

maxsum: integer;

arr: array[1..10000] of integer;

f: text;

begin

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

reset(f);

maxsum := 0;

count := 0;

for i := 1 to 10000 do readln(f, arr[i]);

for i := 1 to 10000 - 1 do

for j := i + 1 to 10000 do begin

if (arr[i] mod 7 = 0) or (arr[j] mod 7 = 0) then

if (arr[i] mod 160 <> arr[j] mod 160) then begin

count := count + 1;

if arr[i] + arr[j] > maxsum then maxsum := arr[i] + arr[j];

end;

end;

writeln(count, ' ', maxsum);

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла ответ  — 12749665 19989.

 

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

f = open('17.txt')

a = [int(i) for i in f]

s = 0

mx = 0

for i in range(len(a) - 1):

for j in range(i + 1, len(a)):

if (a[i] % 160 != a[j] % 160) and ((a[i] % 7 == 0) or (a[j] % 7 == 0)):

s += 1

mx = max(mx, a[i] + a[j])

print(s, mx)

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла ответ  — 12749665 19989.

 

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

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

 

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

from itertools import combinations

f = open('17.txt')

numbers = map(int, f.readlines())

cnt = 0

maxsum = 0

for para in combinations(numbers, 2):

if (para[0]%7 == 0 or para[1]%7 == 0) and para[0]%160 != para[1]%160:

cnt+=1

maxsum = max(maxsum, para[0]+para[1])

print(cnt, maxsum)

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла ответ  — 12749665 19989.

 

При­ведём ре­ше­ние Сер­гея Донец на языке PascalABC.NET.

begin

var (d,p) := (160,7);

var t := ReadAllText('17.txt').ToIntegers

.Combinations(2)

.Where(\(a,b)->((a mod d)<>(b mod d)))

.Where(\(a,b)->(a mod p=0)or(b mod p=0));

Print(t.Count, t.Select(\(a,b)->a+b).Max);

end.

Раздел кодификатора ФИПИ: 1.7.2 Ос­нов­ные кон­струк­ции языка про­грам­ми­ро­ва­ния. Си­сте­ма про­грам­ми­ро­ва­ния