Имеются шесть монет, среди которых две фальшивые. вес фальшивой монеты меньше веса подлинной. составьте алгоритм, позволяющий за три взвешивания на чашечных весах без гирь определить фальшивые монеты.
1. Кладем на каждую чашу по 3 монеты. Весы будут либо в равновесии, либо одна чаша перевесит другую. 1а. Если весы будут уравновешены, то в каждой группе из 3 монет имеется фальшивая. 2а. Проверяем первую группу из 3 монет. Кладем на каждую чашу весов по одной монете. Если весы будут в равновесии, то фальшивая монета - та, которая осталась; если фальшивая монета находится на весах, то взвешивание это покажет (чаша с фальшивой монетой будет выше). 3а. Такие же действия выполняем со второй группой из 3 монет. 1б. Если при первоначальном взвешивании одна чаша перевесит другую, то обе фальшивые монеты находятся в одной группе монет (в той, которая легче). 2б. Кладем на каждую чашу весов по одной монете из выбранной (более легкой) группы монет. Если весы в равновесии, то обе монеты на весах фальшивые. Если одна чаша перевешивает другую, то фальшивые монеты - одна из тех, что находятся на весах (более легкая) и оставшаяся монета. Таким образом, две фальшивые монеты можно определить максимум на три взвешивания, минимум - за два.
Uses crt; var r: array [1..10] of integer; nev, n, min,i, zap:integer; begin clrscr; write('Введите возраст невесты: '); readln(nev); write('Введите число женихов: '); readln(n); if n<2 then for i:=1 to n do begin write('Введите возраст ',i,'-го жениха: '); readln(r[i]); end;
i:=0; zap:=0; while (zap=0) and (i<=n) do begin i:=i+1; min:=nev-r[i]; if min>0 then zap:=i; end; if i<>n then begin for i:=zap to n do begin if min>(nev-r[i]) then begin zap:=i; min:=nev-r[i]; end; end; writeln('Самый молодой жених старше невесты в возрасте ',r[zap], ' лет. Разница в возрасте составляет ', min, ' лет.'); writeln ('По счету это ',i,'-ый жених'); end else writeln('Среди женихов нет подходящего для нашей невесты.'); end; else writeln('Число женихов должно быть более 2!'); end.
var s, wd: string; i, j, m, n, pt, step: integer; Words, WordsSort: array[1..k] of string; InOrder: boolean;
begin Write('Введите строку: '); Readln(s); n := Length(s); pt := 1; m := 0; repeat // Пропускаем все символы до первого непробельного while pt <= n do if Ord(s[pt]) <= 32 then Inc(pt) else break; if pt <= n then begin // Выделяем очередное слово wd := ''; while pt <= n do if Ord(s[pt]) > 32 then begin wd := wd + s[pt];Inc(pt) end else break; if wd <> '' then begin Inc(m);Words[m] := wd end end until pt > n; // Теперь Words содержит все m слов. // Отсортируем их в массиве WordsSort методом Шелла for i := 1 to m do WordsSort[i] := Words[i]; step := m div 2; while step > 0 do begin for j := m - step downto 1 do begin i := j; while i <= m - step do begin if WordsSort[i] > WordsSort[i + step] then begin wd := WordsSort[i]; WordsSort[i] := WordsSort[i + 1]; WordsSort[i + 1] := wd end; i := i + step end end; step := step div 2 end; // Осталось поэлементно сравнить оба массива InOrder := true; i := 1; while InOrder and (i <= m) do begin InOrder := (Words[i] = WordsSort[i]); Inc(i) end; if m = 0 then Writeln('Строка не содержит слов') else if InOrder then Writeln('Cлова упорядочены') else Writeln('Cлова не упорядочены') end.
Введите строку: слово1 слово2 слово4 слово3 слово5 Cлова не упорядочены
"Современный" вариант решения на Паскале:
// PascalABC.Net 3.0, сборка 1064 var s:string; begin Write('Введите строку: '); Readln(s); var Delim:=Range(0,32).Select(x->Chr(x)).ToArray; var Words:=s.Split(Delim).Where(x->x<>''); var WordsSort:=Words.Sorted; if Words.SequenceEqual(WordsSort) then Writeln('Cлова упорядочены') else Writeln('Cлова не упорядочены') end.
1а. Если весы будут уравновешены, то в каждой группе из 3 монет имеется фальшивая.
2а. Проверяем первую группу из 3 монет. Кладем на каждую чашу весов по одной монете. Если весы будут в равновесии, то фальшивая монета - та, которая осталась; если фальшивая монета находится на весах, то взвешивание это покажет (чаша с фальшивой монетой будет выше).
3а. Такие же действия выполняем со второй группой из 3 монет.
1б. Если при первоначальном взвешивании одна чаша перевесит другую, то обе фальшивые монеты находятся в одной группе монет (в той, которая легче).
2б. Кладем на каждую чашу весов по одной монете из выбранной (более легкой) группы монет. Если весы в равновесии, то обе монеты на весах фальшивые. Если одна чаша перевешивает другую, то фальшивые монеты - одна из тех, что находятся на весах (более легкая) и оставшаяся монета.
Таким образом, две фальшивые монеты можно определить максимум на три взвешивания, минимум - за два.