Задача1

advertisement
Задача1
1. Дана последовательность натуральных чисел 7, 11, 13, 14, 19, 21, 22, 25, :.
Требуется написать программу, которая по заданному N находит N-ый член этой
последовательности.
Ограничение времени: 1 секунда на тест.
Входные данные
Входной файл INPUT.TXT содержит число N (1000 ≤ N ≤ 2147483647).
Выходные данные
В выходной файл OUTPUT.TXT выведите N-ый член последовательности.
Примеры
№
INPUT.TXT
OUTPUT.TXT
1
1005
524672
2
2100
16781824
ОТВЕТ 1
Рассмотрев двоичные разложения представленных элементов последовательности, можно
сделать вывод о том, что в последовательность входят только те натуральные числа, у
которых три единицы в двоичном разложении. Таким образом, n-й член
последовательности имеет вид 2k1+2k2+2k3. l+1-значных двоичных чисел с тремя
единицами всего l*(l-1)/2. Это позволяет найти k1. Из аналогичных соображений находим
k2 и k3. Для вычисления значения самого n-го члена воспользуемся схемой Горнера
2k1+2k2+2k3=((2k1-k2+1)*2k2-k3+1)*2k3. Для вычисления последнего выражения надо
использовать в длинной арифметике две операции: умножение на два и добавление
единицы.
var
n, l : longint;
k1,k2,k3,k,i,j,p : integer;
a : array [1..1000] of integer;
begin
assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);
read(n);
l:=2; while n-l*(l-1) div 2 > 0 do begin
n:=n-l*(l-1) div 2; l:=l+1 end; k1:=l;
l:=1; while n-l>0 do begin
n:=n-l; l:=l+1; end; k2:=l; k3:=n-1;
a[1]:=1; k:=1;
for i:=1 to k1-k2 do begin
p:=0; for j:=1 to k do begin
p:=p+a[j]*2; a[j]:=p mod 10; p:=p div 10
end;
if p>0 then begin k:=k+1; a[k]:=p end end;
a[1]:=a[1]+1;
for i:=1 to k2-k3 do begin
p:=0; for j:=1 to k do begin
p:=p+a[j]*2; a[j]:=p mod 10; p:=p div 10
end;
if p>0 then begin k:=k+1; a[k]:=p end end;
a[1]:=a[1]+1;
for i:=1 to k3 do begin
p:=0; for j:=1 to k do begin
p:=p+a[j]*2; a[j]:=p mod 10; p:=p div 10
end;
if p>0 then begin k:=k+1; a[k]:=p end end;
for i:=k downto 1 do write(a[i]);
close(output)
end.
Задача 2
Для содержания двух воинственных инопланетян Aки и Bуки используется клетка с
многослойной перегородкой, которая изготавливается из имеющихся N сеток. Для каждой
сетки i (i = 1, :, N) известно время ее разрушения инопланетянином Aки - ai и
инопланетянином Bуки - bi. Разрушение сетки каждым из инопланетян происходит
последовательно слой за слоем, с постоянной скоростью по толщине сетки.
Требуется написать программу проектирования такой перегородки, время разрушения
которой было бы максимальным.
Ограничение времени: 1 секунда на тест.
Входные данные
В первой строке входного файла INPUT.TXT записано число N (1 ≤ N ≤ 256). В каждой из
последующих N строк содержатся два положительных вещественных числа ai и bi,
разделенные пробелом.
Выходные данные
В первую строку выходного файла OUTPUT.TXT записать время разрушения перегородки
с точностью, не меньшей 10-3. В следующую строку файла записать номера сеток в
порядке их расположения от инопланетянина Aки к инопланетянину Bуки, разделяя числа
пробелами.
Пример
№
INPUT.TXT
OUTPUT.TXT
1
4
6.000
1
2
1
2
0.5
4213
1.5
7 3.5
ОТВЕТ 2
Необходимо отсортировать перегородки по отношению времён их разрушения
инопланетянами. После этого подсчитываем время их разрушения.
var i,n:integer;
while uk1<>uk2 do begin
a,b,c:array[1..300] of real;
t11:=t1+A[d[uk1]];
d:array[1..300] of integer;
t22:=t2+b[d[uk2]];
procedure Sort;
if t11<t22 then begin
var i,j,y:integer;x:real;
inc(uk1);t1:=t11;end
begin
else begin dec(uk2);t2:=t22;end;
for i:=1 to n do
end;
for j:=i+1 to n do begin
if t1>t2 then begin
if c[j]>c[i] then begin
t:=(t1-t2)/b[d[uk1]];
x:=c[i];y:=d[i];
t2:=t1;
c[i]:=c[j];d[i]:=d[j];
end else begin
c[j]:=x;d[j]:=y;
t:=(t2-t1)/a[d[uk1]];
end;end;
t1:=t2;
end;
end;
function Time:real;
t:=t1+(1-t)/(1/a[d[uk1]]+1/b[d[uk1]]);
var uk1,uk2:integer;
Time:=t;
t11,t22,t,t1,t2:real;
end;
begin
BEGIN
uk1:=1;uk2:=n;
Assign(input,'input.txt');
t1:=0;t2:=0;
Reset(input);
Assign(output,'output.txt');
Rewrite(output);
Read(n);
for i:=1 to n do begin
read(a[i],b[i]);
c[i]:=a[i]/b[i];
d[i]:=i;
end;
Sort;
Writeln(Time:0:3);
for i:=1 to n do write(d[i],' ');
END.
Задача 3
Вокруг планеты Зин-зик-буль движется два спутника с постоянными угловыми
скоростями. Их положение в двумерном пространстве определяется h часами m минутами.
Требуется написать программу, которая найдет число полных минут до ближайшего
момента полного затмения, (положение спутников на одной прямой с планетой).
Технические требования:
Входной файл: INPUT.TXT.
Выходной файл: OUTPUT.TXT.
Ограничение времени: 1 секунда на тест.
Формат входных данных:
Файл INPUT.TXT состоит из одной строки, в которой через пробел записаны два числа h
(0 ≤ h ≤ 11) и m (0 ≤ m ≤ 59).
Формат выходных данных:
В выходной файл OUTPUT.TXT вывести единственное целое число - найденное число
полных минут.
Пример файлов входных и выходных данных:
INPUT.TXT
OUTPUT.TXT
00
0
11
4
ОТВЕТ 3
Легко заметить, что в течении одного полного оборота спутников моментов нахождения
на одной прямой всего одиннадцать: 0 часов, 0 минут; 1 час, 5 минут и несколько секунд;
2 часа, 10 минут и несколько секунд и т.д. Эти моменты можно получить из простого
уравнения 11t=720k, где t– время совпадения в минутах, а k равно последовательно 0, 1, 2,
:, 10. По заданному времени (часы, минуты) находим это время в минутах, а после этого
ближайшее после него время нахождения на одной прямой. Чтобы избежать дробных
чисел будем измерять время не в минутах, а в одну одиннадцатую минуты.
var
h, m, t : integer;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt'); rewrite(output);
read(h,m);
t:=11*(60*h+m) mod 720;
if t<>0 then t:=720-t;
write(t div 11)
end.
Download