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

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

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

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

За­да­ние 26

В пер­вой стро­ке вход­но­го файла на­хо­дят­ся два числа: S  — раз­мер сво­бод­но­го места на диске (на­ту­раль­ное число, не пре­вы­ша­ю­щее 10 000) и N  — ко­ли­че­ство поль­зо­ва­те­лей (на­ту­раль­ное число, не пре­вы­ша­ю­щее 3000). В сле­ду­ю­щих N стро­ках на­хо­дят­ся зна­че­ния объёмов фай­лов каж­до­го поль­зо­ва­те­ля (все числа на­ту­раль­ные, не пре­вы­ша­ю­щие 100), каж­дое в от­дель­ной стро­ке.

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

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

100 4

80

30

50

40

При таких ис­ход­ных дан­ных можно со­хра­нить файлы мак­си­мум двух поль­зо­ва­те­лей. Воз­мож­ные объёмы этих двух фай­лов  — 30 и 40, 30 и 50 или 40 и 50. Наи­боль­ший объём файла из пе­ре­чис­лен­ных пар  — 50, по­это­му ответ для при­ведённого при­ме­ра:

2 50

 

Ответ:

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

Ре­ше­ние.

Сна­ча­ла счи­та­ем в мас­сив дан­ные из файла. После этого от­сор­ти­ру­ем мас­сив в по­ряд­ке воз­рас­та­ния. Таким об­ра­зом, по­сле­до­ва­тель­но скла­ды­вая эле­мен­ты мас­си­ва с на­ча­ла и срав­ни­вая сумму с раз­ме­ром сво­бод­но­го места на диске, по­лу­чим мак­си­маль­ное ко­ли­че­ство поль­зо­ва­те­лей, чьи файлы могут по­ме­стить­ся на диске. Далее, вы­чи­тая из най­ден­ной суммы наи­боль­ший файл в те­ку­щей по­сле­до­ва­тель­но­сти, будем про­бо­вать при­бав­лять файлы с боль­шим весом. Если такой файл будет най­ден, то за­ме­ня­ем зна­че­ние наи­боль­ше­го файла, ко­то­рый воз­мож­но по­ме­стить на диск.

 

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

var

i, j, t: integer;

a: array [1..3000] of integer;

s: integer;

n: integer;

sum: integer;

maxi: integer;

f: text;

begin

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

reset(f);

readln(f, s, n);

for i := 1 to n do readln(f, a[i]);

for i := 1 to n do

for j := i + 1 to n do

if a[i] > a[j] then begin

t := a[i];

a[i] := a[j];

a[j] := t;

end;

sum := 0;

maxi := 1;

for i := 1 to n do

if sum + a[i] <= s then begin

sum := sum + a[i];

maxi := i;

end;

t := a[maxi];

for i := maxi to n do

if ((sum - t) + a[i]) <= s then begin

sum := sum - t + a[i];

t := a[i];

end;

writeln(maxi, ' ', t);

end.

 

Ответ: 650 27.

 

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

 

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

f = open('27885.txt')

data = f.readlines()

s = data[0].split()

s = int(s[0])

del (data[0]) # пер­вая стро­ка боль­ше не нужна, уда­ля­ем ее

for i in range(0, len(data)):

data[i] = int(data[i])

data = sorted(data)

summa = 0

for count in range(0, len(data)):

if summa + data[count] > s: break

summa += data[count]

print(count)

zapas = s - summa

for i in range(0, len(data)):

if data[i] - data[count - 1] <= zapas:

itog = data[i]

print(itog)

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