Решение задач олимпиады по программированию 2011г

advertisement
Решение задач олимпиады по программированию 2011г.
Задача №1. (4 балла)
В массиве a[0]...a[n] могут встретиться целые числа от 1 до n, Найти числа,
встречающиеся чаще и реже всех.
Решение:
Алгоритм
 Заводим еще один целочисленный массив b[n], в котором каждый элемент b[i]
имеет значение числа раз, которое число i встречалось в массиве a[0]...a[n-1 В
цикле перебираем элементы массива а[i] и увеличиваем на 1 значение b[a[i]]
 После в цикле перебираем элементы массива b[i] и ищем максимальное и
минимальное значения.
 Выводим значения тех а[i] , которые встречались чаще и реже всех.
Пример решения задачи участником Коксиным А.М.
program frequency;
uses CRT;
const
lim=500;
var
num_array: array[1..lim] of word;
min, max,N,cur,i: word;
input, output: text;
begin
ClrScr;
Assign(input, 'input.txt');
Assign(output, 'output.txt');
Reset(input);
Rewrite(output);
readLn(input,N);
for i:=0 to n do
begin
read(input,cur);
Inc(num_array[cur]);
end;
max:=0;
min:=65535;
for i:=1 to n do
begin
if num_array[i]>max then max:=num_array[i];
if (num_array[i]<min) and (num_array[i]>0) then min:=num_array[i];
end;
for i:=1 to n do if num_array[i]=max then write(output,i,' ');
writeLn(output,'');
for i:=1 to n do if num_array[i]=min then write(output,i,' ');
close(input);
close(output);
readLn;
end.
В этом решении чтение/запись в файл легко можно заменить вводом с клавиатуры и
выводом на экран.
Задача №2. (3 балла)
Дан номер дня в 2011 году. Определить число и день недели, соответствующие этому
дню. Учесть, что 1 января 2011г. было субботой.
Решение:
Алгоритм
 Заводим массив, в котором содержится число дней в месяце и массив названий
месяцев и дней недели (в этой задаче его удобнее начать с субботы)
 Вычисляем остаток от деления на 7 для вычисления дня недели
 В цикле вычитаем число дней в очередном месяце, пока остаток не станет меньше
числа дней в месяце. Остаток от такого вычитания –число, номер месяца, для
которого нельзя выполнить вычитание –искомый месяц.
Пример решения задачи участником Коксиным А.М.
program date;
uses CRT;
const
month_days: array[0..12] of integer =
(0,31,59,90,120,151,181,212,243,273,304,334,365);
month_names: array[1..12] of string =
('January','February','March','April','May','June','July','August','September','October','Novemb
er','December');
week_names: array[0..6] of string =
('Saturday','Sunday','Monday','Tuesday','Wednesday','Thursday','Friday');
var
dat,i,month,day,week: integer;
begin
Assign(input,'input.txt');
Assign(output,'output.txt');
Reset(input);
rewrite(output);
read(input,dat);
for i:= 1 to 12 do if month_days[i]>dat then begin month:=i; break; end;
day:=dat-month_days[month-1];
week:=(dat-1) mod 7;
Write(output,day, ' ');
WriteLn(output,month_names[month]);
Write(output,week_names[week]);
Close(input);
Close(output);
end.
Задача №3. (2 балла)
Вычислите площадь треугольника, образованного прямой, заданной уравнением y=ax+b,
и осями координат.
Решение:
Алгоритм
Прямая y=ax+b отсекает на осях отрезки b и b/a. Площадь треугольника s=|b2/2a|.
Задача №4. (5 баллов) Электропоезд
Электропоезд отправляется с начальной станции в момент времени чч:мм.. Известно число
станций (n<20) и сколько минут он тратит на проезд между любыми двумя соседними станциями
своего маршрута. Напишите программу, которая вычислит время отправления электропоезда с
каждой станции его маршрута (для последней станции это будет время прибытия — время
стоянки поезда на станциях 2 мин).
Решение:
Алгоритм
Рассчитывается время отбытия и прибытия на станции с учетом того, что ,
 если число минут больше 59, то число минут= число минут-60, число часов=
число часов+1
 если если число часов больше 23, то число часов= число часов-24
Пример решения задачи участником Кабановым Ю.В.
program kabanov_n4;
const max_stations=20;
type TTime=record
hour,min:byte;
end;
var
str1,str2:string;
stations:array[2..max_stations] of integer;
n,i:integer;
StationsTime:array[1..max_stations] of TTime;
f:text;
begin
assign(f,'input.txt');
reset(f);
readln(f,str1);
str2[0]:=chr(2); str2[1]:=str1[4]; str2[2]:=str1[5];
str1[0]:=chr(2);
Val(str1,StationsTime[1].hour,i);
Val(str2,StationsTime[1].min,i);
readln(f,n);
for i:=2 to n do
read(f,stations[i]);
close(f);
for i:=2 to n do
begin
StationsTime[i].hour:=StationsTime[i-1].hour;
StationsTime[i].min:=StationsTime[i-1].min+stations[i];
if (i>=3) then
StationsTime[i].min:=StationsTime[i].min+2;
if (StationsTime[i].min>=60) then
begin
StationsTime[i].hour:=StationsTime[i].hour+
(StationsTime[i].min div 60);
StationsTime[i].min:=StationsTime[i].min(StationsTime[i].min div 60)*60;
end;
if (StationsTime[i].hour>=24) then
begin
StationsTime[i].hour:=StationsTime[i].hour(StationsTime[i].hour div 24)*24;
end;
end;
assign(f,'output.txt');
rewrite(f);
for i:=1 to n do
begin
if (StationsTime[i].hour<10) then write(f,'0');
write(f,StationsTime[i].hour,':');
if (StationsTime[i].min<10) then write(f,'0');
write(f,StationsTime[i].min);
writeln(f);
end;
close(f);
end.
Download