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

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

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

За­да­ние 26

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

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

Два целых не­от­ри­ца­тель­ных числа: мак­си­маль­ное ко­ли­че­ство кон­тей­не­ров, ко­то­рые можно пе­ре­вез­ти за один рейс и масса наи­бо­лее тяжёлого из них.

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

100 4

80

30

50

40

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

 

Ответ:

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

Ре­ше­ние.

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

 

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

var

i, j, t: integer;

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

s: integer;

n: integer;

sum: integer;

maxi: integer;

f: text;

begin

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

 

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

 

Ответ: 1612 90.

 

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

 

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

f = open('26 (5).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)

 

При­ведём ре­ше­ние Мак­си­ма Ми­ти­на (Ниж­ний Нов­го­род) на языке Python.

f = open('26.txt')

l = f.readline()

limit = int(l.split()[0])

n = int(l.split()[1])

a = [int(x) for x in f.readlines()]

a.sort()

ns = 0

k = 0

for i in a:

if ns + i <= limit:

ns += i

k += 1

temp = i

else:

ns -= temp

for j in a:

if ns + j <= limit:

temp = j

else:

break

break

print(k, temp)

 

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

s = [i for i in open('26.txt').readlines()]

capacity = int(s[0].split()[0])

containers = [int(i) for i in s[1:]]

selectedContainers = []

containers = sorted(containers)

while (capacity - sum(selectedContainers)) >= containers[0]:

selectedContainers.append(containers[0])

containers.pop(0)

# По­лу­чи­ли мас­сив с мак­си­маль­ным ко­ли­че­ством самых лег­ких кон­тей­не­ров

# Те­перь нужно опре­де­лить какой мак­си­маль­ный кон­тей­нер может по­ме­стить­ся в по­след­ний слот

maxLastContainerCapacity = capacity - sum(selectedContainers[:-1])

biggestContainer = max([container for container in containers if container <= maxLastContainerCapacity])

print(len(selectedContainers), biggestContainer)

 

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

f = open('26.txt')

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

a = sorted([int(x) for x in f])

k = 0

for x in a:

if x > s: break

s -= x

last = x

k += 1

s += last

m = max([x for x in a if x <= s])

print(k,m)

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