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

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

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

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

За­да­ние 26

В пер­вой стро­ке вход­но­го файла на­хо­дят­ся два числа: S  — раз­мер сво­бод­но­го места на диске (на­ту­раль­ное число, не пре­вы­ша­ю­щее 10 000) и N  — ко­ли­че­ство поль­зо­ва­те­лей (на­ту­раль­ное число, не пре­вы­ша­ю­щее 4000). В сле­ду­ю­щих 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..4000] of integer;

s: integer;

n: integer;

sum: integer;

maxi: integer;

f: text;

begin

assign(f,'C:\27880.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.

 

При­ведём ре­ше­ние Вла­ди­сла­ва Ма­та­ли­на на языке Python.

f = open('27880.txt')

s, n = map(int, f.readline().split())

v = sorted(map(int, f))

sum, cnt = 0, 0

 for i in range(len(v)):

  if sum + v[i] <= s:

   sum += v[i]

   cnt += 1

biggest_file = v[cnt - 1:][0] + s - sum

while biggest_file not in v:

 biggest_file -= 1

print(cnt, biggest_file)

 

Ответ: 611 27.

 

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

f = open('27880.txt')

s = int(f.readline().split()[0])

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

a.sort()

s1 = 0

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

if s1 + a[i] > s: break

s1 += a[i]

i1 = i

s2 = s1 - a[i1]

for j in range(i1, len(a)):

if s2 + a[j] > s: break

p = a[j]

print(i1 + 1,p)

 

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

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