Игорь Сергеевич уже много лет ведет занятия в школьном кружке по информатике и рассчитывает на триумф своих воспитанников в этом году. По удачному стечению обстоятельств в этом году под его руководством собралось множество талантливых ребят, которые могут принести славу не только школе, но и всему городу. В школьном кружке на данный момент учатся
N
учеников,
M
из которых пишут на языке программирования С++, а остальные пишут на языке Cobol. Игорь Сергеевич обратил внимание на статистику олимпиад лет и заметил, что команды, которые пишут на языке C++, в среднем добиваются лучших результатов на олимпиадах. Для того чтобы все
N
учеников писали на языке C++, он разработал план.
План заключается в следующем: каждую неделю Игорь Сергеевич будет проводить тренировки, в которых будут участвовать команды по
K
человек, при этом распределение школьников на команды может меняться по его усмотрению. Игорь Сергеевич считает, что в результате тренировки внутри каждой команды выбирается язык программирования, на котором пишут большинство её участников, а меньшинство переучивается на новый выбранный язык. При этом язык, на котором писало меньшинство раньше, забывается.
Для примера, если в команде из 11 человек 7 человек пишут на Cobol, а остальные 4 — на C++, то к концу тренировки все 11 участников команды будут писать на Cobol, а С++ будет ими забыт.
Игорь Сергеевич хочет выработать методику тренировок, рассчитанную на безоговорочную победу. Требуется написать программу, которая определит за какое минимальное количество тренировок все ученики перейдут на С++.
Входные данные
В первой строке дается одно целое число
N
— общее количество учеников в школе (
1
≤
N
≤
10
9
).
Во второй строке дается одно целое число
M
— количество учеников, пишущих на языке С++ (
1
≤
M
≤
10
9
).
В третьей строке дается одно целое число
K
— количество людей в одной команде (
1
≤
K
≤
10
9
).
Гарантируется, что
N
делится без остатка на
K
, а
K
— нечетное.
Выходные данные
Ваша задача вывести одно число — минимальное количество тренировок, которое необходимо провести для того, чтобы все школьники начали писать на С++. Если добиться того, чтобы все школьники начали писать на С++ невозможно, то выведите число -1.
Количество символов: 200*50*80
Количество рисунков: 10
Параметры рисунка:
K = 800×600N = 16 цветов- ?
Решение:Находим информационный объем текста:
В условии не сказано, в какой кодировке записан текст, поэтому считаем как 1 байт.
[текста] = 200*50*80*1 = 800 000 байт.
Находим информационный объем рисунка:
i = log₂N = log₂16 = 4 бита
[рисунка] = K*i = 800*600*4 = 1 920 000 бит = 240 000 байт.
[рисунков] = [рисунка] * 10 = 2 400 000 байт.
Находим информационный объем книги:
= [текста] + [рисунков] = 800000 + 2400000 = 3200000 байт
= 3200000 байт = 3125 КБ ≈ 3,05 МБ
ответ: 3125 КБ (примерно 3,05 МБ)
nm = 50;
type
Data = record
day: 1..31;
month: 1..12;
year: integer
end;
lichn = record
famnam: string;
datr: Data
end;
listlichn = array [1..nm] of lichn;
var
m: listlichn;
n: integer;
procedure GetLichn(k: integer);
begin
Write(k, ') Введите через пробел фамилию, имя: ');
Readln(m[k].famnam);
Writeln('Введите через пробел день, месяц и год рождения: ');
Readln(m[k].datr.day, m[k].datr.month, m[k].datr.year)
end;
procedure WriteLichn(k: integer);
begin
Writeln(m[k].famnam, ' ', m[k].datr.day, '.', m[k].datr.month, '.', m[k].datr.year)
end;
procedure Vvod(var p: integer);
var
i: integer;
begin
Write('Введите количество лиц n (максимум 50) -> ');
Readln(p);
if p <= 50 then for i := 1 to p do GetLichn(i)
else begin Writeln('Вы ввели неправильное значение'); p := 0 end
end;
procedure Zapros1;
{ фамилии и имена тех кто родился в месяц l года }
var
i: integer;
l: 1..12;
begin
Write('Введите номер месяца рождения (1-12): ');
Readln(l);
for i := 1 to n do
if m[i].datr.month = l then WriteLichn(i)
end;
procedure Zapros2;
{ фамилии и имена тех кто родился в год a }
var
a, i: integer;
begin
Write('Введите год рождения: ');
Readln(a);
for i := 1 to n do
if m[i].datr.year = a then WriteLichn(i)
end;
procedure Zapros3;
{ фамилии и имена тех чья дата рождения z.l.a }
var
a, i: integer;
z: 1..31;
l: 1..12;
begin
Write('Введите через пробел день, месяц и год рождения: ');
Readln(z, l, a);
for i := 1 to n do
if (m[i].datr.year = a) and (m[i].datr.month = l)
and (m[i].datr.day = z) then
WriteLichn(i)
end;
begin
Vvod(n);
Zapros1;
Zapros2;
Zapros3
end.
Тестовое решение:
Введите количество лиц n (максимум 50) -> 3
1) Введите через пробел фамилию, имя: Иванов Иван
Введите через пробел день, месяц и год рождения:
24 12 1973
2) Введите через пробел фамилию, имя: Петров Петр
Введите через пробел день, месяц и год рождения:
05 03 1982
3) Введите через пробел фамилию, имя: Козлова Екатерина
Введите через пробел день, месяц и год рождения:
1 12 1994
Введите номер месяца рождения (1-12): 12
Иванов Иван 24.12.1973
Козлова Екатерина 1.12.1994
Введите год рождения: 1982
Петров Петр 5.3.1982
Введите через пробел день, месяц и год рождения: 5 3 1982
Петров Петр 5.3.1982