Тема 5: Строки. Элементы лексического и синтаксического разобра
«Печать строк»
Сергей очень любит играть в такую игру: произвольным способом выбирает два натуральных числа
N(1≤N≤100) и M (1≤M≤100).
Создается строка символов, в которых подряд выписываются числа: сначала одна 1, потом две 2, потом три 3 и так далее до N. Например, для N=5 полученная строка такая: 122333444455555. Потом полученная строка записывается в несколько строк по M символов в строке. Последняя строка может быть неполной длинны. Например, предыдущая строка для М=3 будет иметь вид:
Нужно написать программу, которая освободит Сергея от подобного времяпрепровождения.
Входные данные: LINE.DAT в одной строке входного файла заданы два числа N и М, которые не превышают 100 и разделены пробелом.
Выходные данные: LINE.SOLв каждой строке выходного файла должно содержаться по М символов из полученной N строки. Последняя строка может быть неполной.
LINE.DAT | LINE.SOL |
5 3 |
Var
n, m, i, j: byte;{n - количество символов, используемых в строке, m-количество символов в одной строке вывода, i,j - переменные для счетчика цикла}
s, x: string;{s - строка символов, x - очередной символ строки}
Begin
assign(input, 'LINE.dat');{связываем входной файл и файловую переменную}
reset(input);{открываем файл для чтения}
readln(n, m);{считываем входные данные}
close(Input);{закрываем входной файл}
assign(Output,'LINE.sol');{связываем выходной файл и файловую переменную}
rewrite(Output);{открываем файл для записи}
s:='';{обнуляем строку}
fori:=1 ton do{перечисляем цифры для формирования строки}
forj:=1 toi do{перечисляем количество каждой отдельной цифры}
Begin
str(i,x); {переводим цифру в строку}
s:=s+x;{записываем символы в строку}
whileLength(s)>=m do{выводим до тех пор пока длина строки не станет меньшей M}
Begin
writeln(Copy(s,1,m));{копируем и выводим m-символов}
delete(s,1,m);{удаляем в исходной строке m символов}
end;
end;
iflength(s)>0 thenwriteln(s);{выводим последние символы в файл}
close(Output);{закрываем файл}
end.
Тема: Метод перебора вариантов, отсечение перебора
Задача«Вырубка деревьев»
Король Флатландии решил вырубить некоторые деревья, растущие перед его дворцом. Деревья перед дворцом короля посажены в ряд, всего там растет N деревьев, расстояния между соседними деревьями одинаковы.
После вырубки перед дворцом должно остаться M деревьев, и расстояния между соседними деревьями должны быть одинаковыми. Помогите королю выяснить, сколько существует способов вырубки деревьев.
Входные данные
Входной файл INPUT.TXT содержит два целых числа M и N (0 <= M <= N <= 1000).
Выходные данные
В выходном файле OUTPUT.TXT должно содержаться одно число - искомое количество способов.
Комментарии
Требуется написать программу, которая по заданным числам N и M определит, сколько существует способов вырубки некоторых из N деревьев так, чтобы после вырубки осталось M деревьев и соседние деревья находились на равном расстоянии друг от друга.
Примечания
Зафиксируем расстояние между деревьями после вырубки. Если оно равно d, то возможно n – d(m – 1) – m + 1 способов вырубить деревья. Суммируя по всем d, получаем ответ.
Если у нас есть 0 деревьев и 0 деревьев должно остаться после вырубки, то существует один вариант вырубки - это надо учитывать при решении задачи.
INPUT.TXT | OUTPUT.TXT |
5 3 |
Progpam 111;
Var
n, m: longint;
i, d, s: longint;
input, output: text;
Begin
Assign(input,'input.txt');
Reset(input);
Read (input, n, m);
Close(input);
s:=0;
if m = 0 then
s:=1
Else
if m = 1 then
s:= n
Else
for d:= 1 to (n-1) div (m-1) do
inc(s,n-(m-1)*d);
Assign(output,'output.txt');
Rewrite(output);
Write(output,s);
Close(output);
end.
Тема: Сортировка и выбор
Условие задачи: Для игры в квидич используются мячи - снитчи. Проблема заключается в том, что они разного размера. Для проведения матча требуется выбрать снитч нужного веса. Перед началом матча все снитчи выстраиваются в ряд в порядке неубывания весов и Гарри Поттер должен как можно быстрее найти снитч с весом ровно Х кг или сообщить судье об отсутствии нужного мяча.
Формат входных данных:
В первой строке входного файла записаны через пробел два целых числа N и X. В следующих N строках записаны веса мячей в порядке неубывания (по одному числу в строке). Веса – целые числа, не превосходящие 100, 0<N£50000.
Формат выходных данных:
В выходной файл вывести номер снитча, имеющего вес X или число 0, если такого снитча нет.
Лимит времени: 1 секунда на тест.
Пример:
INPUT. TXT | OUTPUT.TXT |
5 3 |
Указания к решению. Очевидное решение состоит в просмотре всего ряда снитчей сначала до конца, что требует времени, пропорционального числу снитчей. Однако этот алгоритм не использует того факта, что веса снитчей уже отсортированы. Наилучший метод поиска состоит в том, чтобы проверить, стоит ли нужный мяч в середине ряда. Если да, то ответ получен. Если вес x меньше веса среднего снитча, то мы можем применить тот же метод поиска к отсортированному подряду слева от среднего элемента; аналогично, если x больше веса среднего мяча, то в дальнейшем мы будем рассматривать правую половину ряда.
Код возможного решения:
program tt;
const bl = 32;
type mass = array [1..bl] of integer;
var i, n, h, x : integer;
a : mass;
input, output : text;
function snwe (a : mass; st, n, x, h : integer) : integer;
var i, br : integer;
begin
br:=round ((n-st)/2);
h:=br+st;
if (br = 0) then
begin
snwe:=0;
exit;
end;
if (a[h] = x) then
begin
snwe:=h;
end
else
begin
if (a[h] > x) then
begin
n:=n-br;
end
else
begin
st:=st+br;
end;
snwe:=snwe (a, st, n, x, h);
end;
end;
begin
assign (input, 'c:\input.txt');
assign (output, 'c:\output.txt');
filemode:=2;
reset (input);
rewrite (output);
read (input, n, x);
for i:=1 to n do
begin
read (input, a[i]);
end;
close (input);
write (output, snwe (a, 1, n, x, h));
close (output);
end.