// PascalABC.Net 3.0, сборка 1052 const Rus=['А'..'Я']; var s:string; i,k,t:integer; c,c1,tc,sc:char; f:array['А'..'а'] of byte; // 'а' - это для 'Ё' ch:array['А'..'а'] of char; begin Write('Введите строку: '); Readln(s); for c:='А' to 'а' do begin f[c]:=0; ch[c]:=c end; k:=0; for i:=1 to Length(s) do begin c:=UpCase(s[i]); if c in Rus then begin Inc(f[c]); Inc(k) end else if c='Ё' then begin Inc(f['а']); Inc(k) end; end; Writeln('Количество русских букв равно ',k); { сортировка массива со счетчиком количества букв } for c1:='А' to Pred('а') do for c:='А' to Pred('а') do if f[c]<f[Succ(c)] then begin t:=f[c]; tc:=ch[c]; sc:=Succ(c); f[c]:=f[sc]; ch[c]:=ch[sc]; f[sc]:=t; ch[sc]:=tc end; Writeln('Частота встретившихся букв'); c:='А'; while (c<='а') and (f[c]>0) do begin if ch[c]='а' then ch[c]:='Ё'; Writeln(ch[c],' - ',f[c]); Inc(c) end; end.
Тестовое решение: Введите строку: Когда я был парнишкой, носил я брюки клёш Количество русских букв равно 33 Частота встретившихся букв К - 4 И - 3 Л - 3 О - 3 А - 2 Б - 2 Н - 2 Р - 2 Ш - 2 Я - 2 Г - 1 Д - 1 Й - 1 П - 1 С - 1 Ы - 1 Ю - 1 Ё - 1
Лемма. Если на каком-то шаге все куски одинаковой массы m, то можно путём указанных операций сделать так, чтобы все куски стали массой m/2. Доказательство. На первом шаге съедаем кусок массы m и разрезаем другой кусок массы m. Получится 8 кусков массы m и 2 куска массы m/2. Теперь 8 раз съедаем куски m/2 и распиливаем куски массы m.
Перейдём к собственно решению. Понятно, что Саша не мог съесть весь сыр. Поэтому, поскольку он съел целое число граммов сыра, он мог съесть не более, чем 360 - 1 = 359 граммов. Покажем, как он это мог сделать.
Пусть изначально головка сыра была разрезана так: 5 кусков по 512/9 г, 2 куска по 256/9 г, 1 кусок 128/9 г, 1 кусок 32/9 г, 1 кусок 8/9 г (легко проверить, что сумма всех масс равна 360).
Сначала съедим куски массой 8/9, 32/9, 128/9 и распилим три куска по 512/9 г. Останется 2 куска по 512/9 и 8 кусков по 256/9. Затем дважды съедим куски по 256/9 и разрежем оставшиеся куски по 512/9. После этого будет 10 кусков по 256/9.
Уменьшим размер каждого куска в 256 раз (воспользуемся 8 раз процессом, описанным в лемме). Тогда останутся 10 кусков массой 1/9 г. Съедаем один кусок и распиливаем любой оставшийся кусок. Несъеденная масса 9 * 1/9 = 1 г, значил, съел Саша 360 - 1 = 359 г сыра.
Лемма. Если на каком-то шаге все куски одинаковой массы m, то можно путём указанных операций сделать так, чтобы все куски стали массой m/2. Доказательство. На первом шаге съедаем кусок массы m и разрезаем другой кусок массы m. Получится 8 кусков массы m и 2 куска массы m/2. Теперь 8 раз съедаем куски m/2 и распиливаем куски массы m.
Перейдём к собственно решению. Понятно, что Саша не мог съесть весь сыр. Поэтому, поскольку он съел целое число граммов сыра, он мог съесть не более, чем 360 - 1 = 359 граммов. Покажем, как он это мог сделать.
Пусть изначально головка сыра была разрезана так: 5 кусков по 512/9 г, 2 куска по 256/9 г, 1 кусок 128/9 г, 1 кусок 32/9 г, 1 кусок 8/9 г (легко проверить, что сумма всех масс равна 360).
Сначала съедим куски массой 8/9, 32/9, 128/9 и распилим три куска по 512/9 г. Останется 2 куска по 512/9 и 8 кусков по 256/9. Затем дважды съедим куски по 256/9 и разрежем оставшиеся куски по 512/9. После этого будет 10 кусков по 256/9.
Уменьшим размер каждого куска в 256 раз (воспользуемся 8 раз процессом, описанным в лемме). Тогда останутся 10 кусков массой 1/9 г. Съедаем один кусок и распиливаем любой оставшийся кусок. Несъеденная масса 9 * 1/9 = 1 г, значил, съел Саша 360 - 1 = 359 г сыра.
const
Rus=['А'..'Я'];
var
s:string;
i,k,t:integer;
c,c1,tc,sc:char;
f:array['А'..'а'] of byte; // 'а' - это для 'Ё'
ch:array['А'..'а'] of char;
begin
Write('Введите строку: '); Readln(s);
for c:='А' to 'а' do begin f[c]:=0; ch[c]:=c end;
k:=0;
for i:=1 to Length(s) do begin
c:=UpCase(s[i]);
if c in Rus then begin Inc(f[c]); Inc(k) end
else
if c='Ё' then begin Inc(f['а']); Inc(k) end;
end;
Writeln('Количество русских букв равно ',k);
{ сортировка массива со счетчиком количества букв }
for c1:='А' to Pred('а') do
for c:='А' to Pred('а') do
if f[c]<f[Succ(c)] then begin
t:=f[c]; tc:=ch[c]; sc:=Succ(c);
f[c]:=f[sc]; ch[c]:=ch[sc];
f[sc]:=t; ch[sc]:=tc
end;
Writeln('Частота встретившихся букв');
c:='А';
while (c<='а') and (f[c]>0) do begin
if ch[c]='а' then ch[c]:='Ё';
Writeln(ch[c],' - ',f[c]);
Inc(c)
end;
end.
Тестовое решение:
Введите строку: Когда я был парнишкой, носил я брюки клёш
Количество русских букв равно 33
Частота встретившихся букв
К - 4
И - 3
Л - 3
О - 3
А - 2
Б - 2
Н - 2
Р - 2
Ш - 2
Я - 2
Г - 1
Д - 1
Й - 1
П - 1
С - 1
Ы - 1
Ю - 1
Ё - 1