1.Новый интернет-провайдер предоставляет услугу доступа в интернет с посекундной тарификацией . Для подключения нужно купить карточку позволяющую пользоваться интернетом определенное количество секунд .
при этом компания предает карточки стоимостью 1,2,4,..., 2 в 30-ой степени рублей на а0, а2,..... а30 секунд соответственно.
Родители разрешили Пете пользоваться интернетом М секунд . Определите за какую наименьшую сумму он сможет купить карточки , которые позволяют ему пользоваться интернетом не менее М секунд. Естественно, что Петя может купить как карточки различного достоинтства, так и несколько карточек одного достоинтства.
ПОЯСНЕНИЕ
Если ai<2•ai-1, то можно вместо карточки стоимотью 2i купить 2 карточки меньшей стоимости. Заменяем ai лучшим вариантом.
Затем покупаем карточки на нужное время, на каждом шаге выбирая карточку (набор карточек) с большим временем, но не превосходящим времени, которое осталось набрать.
Посмотреть решение
Как перевести этот код с паскаля в делфи?
var
a:array[0..30] of int64;
p,m:int64;
i:integer;
begin
read(m);
for i:=0 to 30 do
read(a[i]);
for i:=1 to 30 do
if a[i-1]*2>a[i] then
a[i]:=a[i-1]*2;
p:=0;
for i:=30 downto 0 do
if m>=a[i] then
begin
m:=m-a[i];
p:=p+(1 shl i);
end;
if m>0 then inc(p);
writeln(p);
end.
Я его перевел посмотрите правильно ли ?
var
a:array[0..30] of int64;
p,m:int64;
i:integer;
Procedure TForm1.Button1Click(Sender;Tobject)
begin
m:=strtoint(Edit1.Text);
for i:=0 to 30 do
a[i]:=strtoint(StringGrid.Cells[i-1,0]; label1.caption:=' ';
for i:=1 to 30 do
if a[i-1]*2>a[i] then
a[i]:=a[i-1]*2;
p:=0;
for i:=30 downto 0 do
if m>=a[i] then
begin
m:=m-a[i];
p:=p+(1 shl i); <<<<<<<<<<========= что за shl i ????????????
end;
if m>0 then label1.Caption:=inttostr(p) + 'наименьшая сумма';
end.