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

Для пе­ре­воз­ки пар­тии гру­зов раз­лич­ной массы вы­де­лен гру­зо­вик, но его гру­зо­подъёмность огра­ни­че­на, по­это­му пе­ре­вез­ти сразу все грузы не удаст­ся. Грузы мас­сой от 200 до 210 кг гру­зят в первую оче­редь, га­ран­ти­ру­ет­ся, что все такие грузы по­ме­стят­ся. На остав­ше­е­ся после этого место ста­ра­ют­ся взять как можно боль­ше гру­зов. Если это можно сде­лать не­сколь­ки­ми спо­со­ба­ми, вы­би­ра­ют тот спо­соб, при ко­то­ром самый боль­шой из вы­бран­ных гру­зов имеет наи­боль­шую массу. Если и при этом усло­вии воз­мож­но не­сколь­ко ва­ри­ан­тов, вы­би­ра­ет­ся тот, при ко­то­ром наи­боль­шую массу имеет вто­рой по ве­ли­чи­не груз, и так далее. Из­вест­ны ко­ли­че­ство гру­зов, масса каж­до­го из них и гру­зо­подъёмность гру­зо­ви­ка. Не­об­хо­ди­мо опре­де­лить ко­ли­че­ство и общую массу гру­зов, ко­то­рые будут вы­ве­зе­ны при по­груз­ке по вы­ше­опи­сан­ным пра­ви­лам.

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

За­да­ние 26

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

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

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

6 605

140

205

120

160

100

340 В дан­ном слу­чае сна­ча­ла нужно взять груз мас­сой 205 кг. После этого можно вы­вез­ти ещё мак­си­мум 3 груза. Это можно сде­лать тремя спо­со­ба­ми: 140 + 120 + 100, 140 + 160 + 100, 120 + 160 + 100. Вы­би­ра­ем спо­соб, при ко­то­ром вы­во­зит­ся груз наи­боль­шей воз­мож­ной массы. Таких спо­со­бов два: 140 + 160 + 100 и 120 + 160 + 100. Из этих спо­со­бов вы­би­ра­ем тот, при ко­то­ром боль­ше масса вто­ро­го по ве­ли­чи­не груза, то есть 140 + 160 + 100. Всего по­лу­ча­ет­ся 4 груза общей мас­сой 605 кг. В от­ве­те надо за­пи­сать числа 4 и 605.

 

Ответ:

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

Ре­ше­ние.

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

 

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

var

i, j, t, count: integer;

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

s: integer;

n: integer;

sum: integer;

maxi: integer;

f: text;

begin

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

reset(f);

readln(f, n, s);

sum := 0;

count := 0;

for i := 1 to 1000 do a[i] := 0;

for i := 1 to n do begin

readln(f, t);

if ((t >= 200) and (t <= 210) and (sum + t <= s)) then begin

sum := sum + t;

count := count + 1;

end

else

a[i] := t;

end;

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;

maxi := 1;

for i := count+1 to n do

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

sum := sum + a[i];

count := count + 1;

maxi := i;

end;

writeln(a);

writeln(n);

writeln(maxi);

writeln(sum);

for i := maxi downto 1 do begin

sum := sum - a[i];

t := i;

for j := maxi to n do

if (sum + a[j]) <= s then t := j

else break;

sum := sum + a[t];

n:=t - 1;

maxi := maxi - 1;

end;

writeln(count, ' ', sum);

end.

 

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

 

Ответ: 123 10000.

 

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

 

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

f = open('26 (13).txt')

a, b = f.readline().split()

d = []

s = 0

count = 0

for i in f:

if 200 <= int(i) <= 210:

s += int(i)

count += 1

else:

d.append(int(i))

d.sort()

d2 = []

i = 0

while sum(d2) + d[i] <= int(b) - s:

count += 1

d2.append(d[i])

i += 1

k = len(d) - 1

while i > 0:

while k >= 0:

if sum(d2) - d2[i-1] + d[k] <= int(b) - s and d[k] != 0:

d2[i-1] = d[k]

d[k] = 0

i -= 1

break

else:

k -= 1

s += sum(d2)

print(count, s)

 

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

f = open('26.txt')

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

g0 = [int(s) for s in f] # все грузы

g = [x for x in g0 if not (200 <= x <= 210)] # грузы кроме диа­па­зо­на 200 кг - 210 кг

mass = sum(g0) - sum(g) # масса гру­зов диа­па­зо­на 200 кг - 210 кг

k = len(g0) - len(g) # ко­ли­че­ство гру­зов диа­па­зо­на 200 кг - 210 кг

g.sort()

kuzov = [] # грузы, ко­то­рые пе­ре­во­зим

while mass + sum(kuzov) + g[0] <= m: kuzov.append(g.pop(0)) # на­чаль­ный ва­ри­ант

for i in range(len(kuzov)-1,-1,-1): # по­оче­ред­ная за­ме­на гру­зов на более тя­же­лые

limit=m - mass - sum(kuzov) + kuzov[i] # лимит массы

gruz = [x for x in g if x <= limit] # грузы для за­ме­ны

if not gruz: break # гру­зов на за­ме­ну нет

gr = max(gruz) # самый тя­же­лый груз для за­ме­ны

g.append(kuzov[i]) # воз­вра­ща­ем груз из ку­зо­ва

kuzov[i] = gr # за­ме­ня­ем более тя­же­лым

g.remove(gr) # уда­ля­ем взя­тый груз

print(k + len(kuzov),mass + sum(kuzov))


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

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