Решение задач олимпиады по программированию 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.