Перейти на главную страницу
Входные данные во всех задачах вводятся из файла, выходные данные выводятся в файл. Имя входного файла во всех задачах — input.txt, выходного — output.txt. При тестировании файлы будут находиться в текущем каталоге (то есть указывать полные пути к файлам не нужно).
Если вы не умеете вводить информацию из файла и выводить в файл, вводите с клавиатуры, выводите на экран, соблюдая формат ввода-вывода. В этом случае (если вы пишете на паскале) ваша программа не должна использовать модуль crt.
Входные данные полностью соответствуют описанному в условии формату и указанным ограничениям, проверять корректность входных данных не нужно.
Выходные данные также должны быть выведены в полном соответствии с описанным форматом выходных данных. Выводить дополнительную информацию не нужно.
Время работы программы на каждом тесте не должно превышать ограничения, указанного в условии задачи.
Не забывайте время от времени сохранять свои решения!
Задача A. Алгоритм Евклида
Имя входного файла: |
input.txt |
Имя выходного файла: |
output.txt |
Максимальное время работы на одном тесте: |
2 секунды |
Максимальный объем используемой памяти: |
64 мегабайта |
Алгоритм Евклида заключается в следующем:
Требуется написать программу, которая решает эту задачу
Первая строка входного файла содержит количество наборов входных данных K (1 ≤ K ≤ 100). Далее идут описания этих наборов. Каждое описание состоит из двух строк. Первая из них содержит два целых числа: a, b (1 ≤ a, b ≤ 1018). Вторая строка – два целых числа: c, d (1 ≤ c, d ≤ 1018).
Все числа в строках разделены пробелом
Формат выходных данных
Для каждого набора входных данных выведите в выходной файл слово «YES», если в процессе применения алгоритма Евклида к паре чисел (a, b) в какой-то момент получается пара (c, d). В противном случае выведите слово «NO».
input.txt |
output.txt |
2 20 10
10 10 10 7
2 4 |
YES NO
|
Имя входного файла: |
input.txt |
Имя выходного файла: |
output.txt |
Максимальное время работы на одном тесте: |
1 секунда |
Максимальный объем используемой памяти: |
64 мегабайта |
Известно, сколько времени электропоезд тратит на проезд между любыми двумя соседними станциями своего маршрута. Известно время отправления с начальной станции. Напишите программу, которая вычислит время отправления электропоезда с каждой станции его маршрута (для последней станции это будет время прибытия — временем стоянки поезда на станциях мы пренебрежем).
В первой строке задано время отправления поезда с начальной станции. Время задается в следующем формате: сначала идут две цифры, задающие часы (от 00 до 23), далее идет двоеточие, затем идут две цифры, задающие минуты (от 00 до 59). Пробелы внутри строки, задающей время, не допускаются.
Во второй строке входного файла записано натуральное число N (2≤N≤1000) — количество станций в маршруте электропоезда (включая начальную и конечную станции). В третьей строке записано N–1 число — первое из этих чисел задает время следования в минутах от начальной станции до второй станции, второе — время от второй станции до третьей и т.д. Каждое из этих чисел натуральное и не превышает 1000.
Формат выходных данных
В выходной файл для каждой станции выведите время прохождения поезда через эту станцию. Время должно быть выведено в том же формате, в каком оно задается во входных данных.
input.txt |
output.txt |
07:00 4 10 5 3 |
07:00 07:10
07:15 07:18
|
22:58 5 2 60 43 20 |
22:58 23:00
00:00 00:43
01:03 |
Имя входного файла: |
input.txt |
Имя выходного файла: |
output.txt |
Максимальное время работы на одном тесте: |
1 секунды |
Максимальный объем используемой памяти: |
64 мегабайта |
После затянувшегося совещания директор фирмы решил заказать такси, чтобы развезти сотрудников по домам. Он заказал N машин – ровно столько, сколь у него сотрудников. Однако когда они подъехали, оказалось, что у каждого водителя такси свой тариф за 1 километр.
Сначала вводится натуральное число N (1≤N≤1000) – количество сотрудников компании (совпадающее с количеством вызванных машин такси). Далее вводится N чисел, задающих расстояния в километрах от работы до домов сотрудников компании (первое число – для первого сотрудника, второе – для второго и т.д.). Все расстояния – положительные целые числа, не превышающие 1000. Далее вводится еще N чисел – тарифы за проезд одного километра в такси (первое число – в первой машине такси, второе – во второй и т.д.). Тарифы выражаются положительными целыми числами, не превышающими 10000.
В выходной файл выведите N чисел. Первое число – номер такси, в которое должен сесть первый сотрудник, второе число – номер такси, в которое должен сесть второй и т.д., чтобы суммарные затраты на такси были минимальны. Если вариантов рассадки сотрудников, при которых затраты минимальны, несколько, выведите любой из них.
input.txt |
output.txt |
3 10 20 30
50 20 30 |
1 3 2 |
5 10 20 1 30 30 3 3 3 2 3
|
1 2 3 5 4 |
Имя входного файла: |
input.txt |
Имя выходного файла: |
output.txt |
Максимальное время работы на одном тесте: |
3 секунды |
Максимальный объем используемой памяти: |
64 мегабайта |
Последовательность чисел назовем симметричной, если она одинаково читается как слева направо, так и справа налево. Например, следующие последовательности являются симметричными:
1 2 3 4 5 4 3 2 1
1 2 1 2 2 1 2 1
Вашей программе будет дана последовательность чисел. Требуется определить, какое минимальное количество и каких чисел надо приписать в конец этой последовательности, чтобы она стала симметричной.
Формат входных данных
Во входном файле записано сначала число N – количество элементов исходной последовательности. Далее записано N чисел – элементы этой последовательности. 1≤N≤100, элементы последовательности – натуральные числа от 1 до 9.
В выходной файл выведите сначала число M — минимальное количество элементов, которое надо дописать к последовательности, а потом M чисел (каждое – от 1 до 9) – числа, которые надо дописать к последовательности.
input.txt |
output.txt |
9 1 2 3 4 5 4 3 2 1 |
0 |
5 1 2 1 2 2 |
3 1 2 1
|
5 1 2 3 4 5 |
4 4 3 2 1
|
При решении данной задачи следует учитывать следующее. Поскольку ограничения на числа a, b ,c, d в этой задаче достаточно большие, простая симуляция описанного в условии алгоритма не будет укладываться в ограничения по времени.
Однако правильная реализация простой симуляции алгоритма проходит не все тесты.
Более быстрый алгоритм таков. Разобьем процесс применения алгоритма Евклида к паре чисел (а, b) на фазы.
Началом фазы будем считать обмен на шаге 3, а окончанием — момент перед следующим таким обменом (или окончание работы алгоритма — для последней фазы). Нетрудно видеть, что если в начале фазы а=а0, b=b0, то в ее конце a=а0 mod b0,b=bo. В то же время на каждом шаге внутри фазы из а вычиталось bo, т.е. а последовательно было равно a0, a0 – b0, a0-2b0, … , a0 mod b0.
Для того чтобы проверить, встречалась ли пара (с, d) во время фазы, надо проверить следующие условия:
1. d=b0
2. с - (а0 mod b0) делится на b0
3. с≤ c0
Приведем пример реализации:
a,b,c,d,n : int64;
t:integer;
t:=a;a:=b;b:=t;
// проверка интервала (a,b) и (a mod b,b)
writeln('YES');
exit;
end;
// переход к следующему интервалу.
a := a mod b;
swap(a,b);
writeln('NO');
i: integer;
assign(input, 'euclid.in');reset(input);
assign(output, 'euclid.out');rewrite(output);
readln(n);
read(a,b,c,d);
solve;
end;
end;
begin
init;
Это несложная техническая задача. В ней требовалось аккуратно реализовать считывание и вывод времени в формате ЧЧ:ММ, получение времени прибытия на станцию по времени прибытия на предыдущую и количеству минут, затраченных на переезд между станциями. При данных в задаче ограничениях вторую из операций можно было реализовать двумя способами:
1) реализовать прибавление ко времени одной минуты и получать нужное время путём прибавления по минуте в цикле;
2) реализовать прибавление произвольного количества минут, удовлетворяющих условию задачи, ко времени.
Остаётся не забыть про переход через 24 часа.
Теперь рассмотрим, как можно было это всё реализовать на Delphi. Положим, что в переменной H хранятся текущие часы, а в переменной M – текущие минуты.
Для считывания времени понадобятся две дополнительные переменные: S типа String[2] и Tmp типа Char.
Read(S,Tmp); {Считываем первые два символа - часы, а затем двоеточие}
H:=StrToInt(S);
Read(S); {Считываем минуты}
M:=StrToInt(S);
H:=(H + (DM+M) Div 60) Mod 24;
M:=(DM+M) Mod 60;
Для вывода времени в формате ЧЧ:ММ понадобится два условных оператора:
If H<10 Then Write(‘0’); {Выводим часы и двоеточие}
Write(H,’:’);
If M<10 Then Write(‘0’); {Выводим минуты}
WriteLn(M);
Заметим, что минимум затрат на такси достигается при такой рассадке сотрудников по такси, что 1-й по величине длины поездки сотрудник (1-й тот, чей путь до дома максимален) сидит в 1-м по стоимости такси (1-е такси – такси, тариф в котором минимален). Таким образом, для того, чтобы вывести номер такси, в котором при такой рассадке окажется 1-й сотрудник, требуется отсортировать расстояния и тарифы в порядке убывания и возрастания соответственно.
Начнем с функции, которая будет проверять, является ли последовательность a[1], a[2], …, a[k] палиндромной. Для этого нужно сравнить числа a[1] и a[k], a[2] и a[k-1], и т. д. до a[k div 2] и a[k+1-(k div 2)].
a[1] |
a[2] |
… |
a[k div 2] |
a[k+1-(k div 2)] |
… |
a[k-1] |
a[k] |
var
begin
palindrom := false;
break;
end;
Теперь вернемся к исходной задаче. Заметим, что в худшем случае нам придется дописать N-1 чисел. Например, если дана последовательность 1 2 3 … N-1 N, то кратчайшая палиндромная последовательность будет выглядеть так: 1 2 3 … N-1 N N-1 … 3 2 1. В самом лучшем случае наша последовательность уже является палиндромной и дописывать ничего не нужно. Таким образом, ответом в задаче является число от 0 до N-1.
a[N+1]:=a[1];
После этого опять проверим, получился ли палиндром, вызывая функцию palindrom(N+1). Если нас вновь не постиг успех, допишем в конец исходной последовательности два числа:
a[N+2]:=a[1]; a[N+1]:=a[2]
и т. д. до тех пор, пока функция palindrom на очередном шаге не вернет результат TRUE.
Покажем, как организовать этот процесс, используя цикл for:
[1] for i:=0 to N-1 do begin
[2] for j:=1 to i do
[3] a[N+j]:=a[i+1-j]; {Добавляем в конец i чисел}
[4] if palindrom(N+i) then begin
[5] writeln(i); {Печатаем количество добавленных чисел}
[6] for j:=1 to i do
[7] write(a[N+j],’ ’); {Печатаем добавленные числа}
[8] exit;
[9] end;
[10] end.
Пример полного решения на языке Pascal:
var
N,i,j : integer;
function palindrom (k : integer) : boolean;
var
i : integer;
for i:=1 to k div 2 do
if a[i]<>a[k+1-i] then begin
palindrom := false;
break;
end;
assign(INPUT,' input.txt ');reset(INPUT);
assign(OUTPUT,' output.txt');rewrite(OUTPUT);
read(N);
read(a[i]);
for i:=0 to N-1 do begin
for j:=1 to i do
a[N+j]:=a[i+1-j]; {Добавляем в конец i чисел}
if palindrom(N+i) then begin
writeln(i); {Печатаем количество добавленных чисел}
for j:=1 to i do
write(a[N+j],' '); {Печатаем добавленные числа}
close(output);
exit;
end;
close(INPUT);
close(OUTPUT);
end.
Каждая задача, независимо от ее сложности, оценивается из 100 баллов. С целью достижения объективности в оценке полученных участниками решений при проверке программ используются тесты. Количество баллов за тест в случае правильной работы программы на этом тесте назначается жюри исходя из максимального балла оценки решения задачи, общего количества тестов и особенностей конкретного теста. Во многих случаях правильно работающую на каждом тесте программу целесообразно оценивать одинаковым количеством баллов.
К задачам B, C и D прилагаются наборы тестов. Тестировать задачи можно с использованием автоматической системы для самотестирования olympiads.ru, которую можно скачать по адресу https://olympiads.ru/school/system/download/olympiads/download.shtml.
Решением каждой задачи должен являться исходный текст программы на любом из допустимых языков программирования. В начале решения в комментариях должны быть указаны: фамилия, имя уч
11 09 2014
1 стр.
Какое слово получится, если взять 1-й, 17-й, 15-й и 2-й звуки фразы «Счастье приходит к счастливым»?
23 09 2014
1 стр.
01 10 2014
2 стр.
Слова «достоин» и «удостоен» имеют один и тот же корень, они родственные. Почему слово «удостоен» пишется через Е, а слово достоин – через и ?
08 10 2014
1 стр.
14 10 2014
1 стр.
25 09 2014
1 стр.
Цель доклада – информировать родителей (законных представителей) учащихся и воспитанников, местную общественность об основных результатах, проблемах функционирования и развития обр
10 10 2014
1 стр.
Поздравляем победителей и призёров муниципального этапа Всероссийской олимпиады школьников г. Орск. 2011 2012 учебный год
17 12 2014
1 стр.