Можете объяснить код к задачи по строкам. адача №111159. Создание архива
Системный администратор вспомнил, что давно не делал архива пользовательских файлов.Однако, объем диска, куда он может поместить архив, может быть меньше чем суммарный объем архивируемых файлов.
Известно, какой объем занимают файлы каждого пользователя.
Напишите программу, которая по заданной информации о пользователях и свободному объему на архивном диске определит максимальное число пользователей, чьи данные можно поместить в архив, при этом используя свободное место как можно более полно.
Входные данные
Программа получает на вход в одной строке число
S
– размер свободного места на диске (натуральное, не превышает 10000), и число
N
– количество пользователей (натуральное, не превышает 100), после этого идет
N
чисел - объем данных каждого пользователя (натуральное, не превышает 1000), записанных каждое в отдельной строке.
Выходные данные
Выведите наибольшее количество пользователей, чьи данные могут быть помешены в архив.
Примеры
входные данные
100 2
200
50
выходные данные
1
входные данные m, b = map(int, input().split())
A = []
B = []
z = 0
sum = 0
while z < b:
A.append(int(input()))
z = z + 1
A = sorted(A)
for i in range(len(A)):
if sum < m:
B.append(A[i])
sum += A[i]
if sum > m:
B.pop()
print(len(B))
Если есть офис, то можете запустить программу.
Код увидеть Alt+F11
Sub massiv()
строка = 3 'не обязательно,номер строки для начала вывода на лист
n = Cells(2, 3) 'не обязательно, вводим количество чисел
Dim B(10000) As Integer 'резервируем память на 10000 целых чисел
S = 0 'обнуляем сумму
For i = 1 To n 'Начало цикла
k = Rnd(1) 'Генерируем случайное число в диапазоне (0;1)
k = k * 9 + 12 'Смещаем его в диапазон [12;20]
k = Int(k) 'обрезаем, оставляя целое
B(i) = k 'заполняем массив
S = S + k 'считаем сумму
Cells(строка, 3) = строка - 2 'не обязательно, вывод номера значеня
Cells(строка, 4) = k 'Не обязательно вывод значения
строка = строка + 1 'не обязательно, увеличить строку для вывода
Next i 'Конец цикла
Cells(строка, 3) = "сумма =" 'не обязательно, выводим надпись
Cells(строка, 4) = S 'не обязательно, выводим сумму
End Sub
ip-адрес это 32 бита (4 байта). маска подсети - тоже 32 бита (4 байта).
ip-адрес можно условно разделить на две части (старшие биты - адрес сети, младшие биты - адрес устройства внутри этой сети). Граница (сколько бит адрес сети, а сколько бит адрес устройства) определяется числом после косой черты. В пунктах 1) и 2) это число 14, то есть под адрес сети отводится 14 бит (значит под адрес устройства: 32-14=18 бит). Чтобы сформировать маску подсети надо записать 32 бита таких чтобы старшие биты (адрес сети) были равны 1, а младшие биты (адрес устройства) были равны 0. Сделаем для случая из п.2 (то есть 14): буду писать группами по 8 бит, чтобы удобней было переводить потом биты в байты.
11111111 11111100 00000000 00000000
если теперь каждый из этих байтов записать в десятичной системе счисления и разделить точками, то получим классическую запись маски подсети (и заодно решение п.2):
255.252.0.0
Теперь насчет емкости (п.1). С такой маской подсети под адрес устройства в этой сети отводится 32-14=18 бит. Значит всего может быть адресов:
Осталось только вспомнить, что адрес где все биты равны нулям используе�ся для обозначения всей подсети, а адрес где все биты равны единицам используется в качестве широковещательного адреса на подсеть. То есть эти два адреса не могут принадлежать ни одному устройству в этой подсети. Получается что всего устройств в подсети (емкость) равна 262144-2=262142. Это ответ на п.1.
С п.3 я не уверен, что правильно понимаю в чём именно во Но насколько понял:
в указанной в задании сети под адрес сети выделено 13 бит, значит под адреса устройств/подсетей 32-13=19 бит.
Маска подсети определяется это количеством бит (причем всегда целым - поэтому разбиение может идти только по целым степеням двойки). Чтобы разбить на 400 подсетей надо под адрес подсети выделить x бит, так чтобы:
нам подходят 9 бит (512 > 400), 10 бит (1024 > 400), 11 бит (2048 > 400) и т. д. В условии есть фраза про максимальную экономию адресного Скорее всего имелось ввиду, чтоб адрес подсети был минимальным. Минимальное из подходящих - это 9 бит.
Итого: в изначальном адресном в условии) адрес сети занимал 13 бит. Адрес подсети (после разбиения на 400 подсетей) "заберёт" ещё 9. Под адреса устройств в каждой подсети остается 32-(13+9)= 10 бит. То есть количество адресов в каждой подсети будет:
Минус два служебных адреса (как и в п.1). Итого 1022 устройства с разными адресами могут быть в каждой из получившихся подсетей
Объяснение: