Pobeda-2014 информатика решите на с++
как известно, современные видеокарты умеют формировать изображения с использованием только треугольников. видеокарта pobeda-2014 не отстает от современных тенденций. известно, что она умеет отображать только прямоугольные равнобедренные треугольники четырех типов ориентации, представленные на рисунках ниже. изменять ориентацию этих треугольников видеокарта не может.
длина катета каждого из представленных выше треугольников равна одному сантиметру. за один такт видеокарта не может отобразить более чем ai треугольников i-того типа.
необходимо определить максимально возможную длину стороны квадрата, который может быть изображен видеокартой на экране монитора за один такт. при этом квадрат должен быть расположен так, чтобы его стороны были параллельны краям монитора.
требуется написать программу, которая решает поставленную .
входные данные
первая строка входного файла input.txt содержит разделенные пробелами четыре целых числа: a1, a2, a3, a4 (0 ≤ a1, a2, a3, a4 ≤ 1018).
выходные данные
в выходной файл output.txt выведите одно число – максимально возможную длину стороны квадрата.
По условию:
abc
+ abc
bca
Понятно, что максимальным число будет, если сложение в двух младших разрядах идет через перенос -> получим систему уравнений:
2c = a +16
2b +1 = c + 16
2a + 1 = b
равносильная ей система
2с = a + 16
c = 2b - 15
b = 2a + 1
подставляем третье во второе, получаем первые два уравнения
2с = a + 16
c = 4a - 13 из этих двух уравнений -> 7a = 42 -> a = 6 -> из третьего уравнения b = 13
13 = D(16), из первого уравнения с = 22/2 = 11(10) = B(16)
-> abc(16) = 6DB(16) = 1755(10), DB6(16) = 3510(10) -> 2abc = bca
i,k,N : Integer;
Begin
For i:=0 to 6 do m[i]:=0;
Readln(N);
k:=6;
While N>0 do
Begin
If N>=Power(2,k) then
Begin
N:=N-Trunc(Power(2,k));
Inc(m[k]);
end else Dec(k);
end;
For i:=0 to 6 do Writeln(Power(2,i),' ',m[i],' шт.');
end.
Еще вариант:
Const
NN = 7;
money : array[1..7] of Integer = (1,2,4,8,16,32,64);
Var m : array[1..NN] of Integer;
i,k,N : Integer;
Begin
For i:=1 to NN do m[i]:=0;
Readln(N);
k:=NN;
While N>0 do
Begin
If N>=money[k] then
Begin
N:=N-money[k];
Inc(m[k]);
end else Dec(k);
end;
For i:=1 to NN do Writeln(money[i],' ',m[i],' шт.');
end.