Дано:
Разрешающая способность сканера 600 х 600 dpi.
Размер 10см x 15см.
Глубина цвета - 3 байта.
Найти:
Каков информационный объём этого файла?
Решение:
Вначале переводим глубину цвета из байт в биты
3 байта * 8бит в байте = 24 бит
Вычисляем разрешение сканера в 1 дюйме квадрат
600*600 = 360 000 пикселей в 1 дюйм^2
Переводим размер картинки из квадратных сантиметров в квадратные дюймы.
10см = 3.937дюйма
15см = 5,906дюйма
10*15=150 см^2 = 3,937 * 5,906 = 23,25 дюйм^2
Вычисляем количество пикселей в изображении
23,25 дюйм^2 * 360 000 пикселей в 1 дюйм^2 = 8 370 000 пикселей
Информационный объём вычисляем по формуле
количество пикселей * глубину цвета =
8 370 000 пикселей * 24 бит = 200 880 000 бит.
Переводим в байты делением на 8.
25 110 000 байт
или же делим на 1024*1024 чтобы получить количество мегабайт
23,95 Мегабайт
Ответ:
Информационный объём сканированного изображения =
25 110 000 байт или 23,95 Мегабайт
Получается, что если Фокс оказался в 10 вагоне, а билет у него на 7 вагон, значит отсчитывал он с начала 7 вагонов, чтобы попасть в свой. Но так как оказался он в 10, значит вагонов всего 17 (10+7).
Из небольших ускорений можно предложить проверять до b[c], дальше всё равно ничего нет. Но всё равно алгоритм будет делать порядка n^2 операций, что при n = 10^5 достаточно много. Кстати, 2*10^9 еще помещается в longint, int64 не нужен.
Можно пойти другим путём. Отсортируем массив A[i] за n log n, а потом для того, чтобы определить уникальные элементы, достаточно одного прохода по массиву.
Я буду сортировать сортировкой слиянием, вы можете использовать любую другую достаточно быструю сортировку.
procedure merge(var a: array of longint; left1, right1, left2, right2: integer);
var
temp: array of longint;
i, j, k: integer;
begin
setLength(temp, right1 - left1 + right2 - left2 + 2);
i := left1;
j := left2;
k := 0;
while (i <= right1) and (j <= right2) do
begin
if a[i] <= a[j] then
begin
temp[k] := a[i];
inc(i);
end else begin
temp[k] := a[j];
inc(j);
end;
inc(k);
end;
while i <= right1 do
begin
temp[k] := a[i];
inc(k);
inc(i);
end;
while j <= right2 do
begin
temp[k] := a[j];
inc(k);
inc(j);
end;
for i := left1 to right1 do
a[i] := temp[i - left1];
for j := left2 to right2 do
a[j] := temp[j - left2 + right1 - left1 + 1];
end;
procedure mergeSort(var a: array of longint; left, right: integer);
var
t: longint;
begin
if right - left = 0 then exit;
if right - left = 1 then
begin
if a[left] > a[right] then
begin
t := a[left];
a[left] := a[right];
a[right] := t;
end;
exit;
end;
mergeSort(a, left, (left + right) div 2);
mergeSort(a, (left + right) div 2 + 1, right);
merge(a, left, (left + right) div 2, (left + right) div 2 + 1, right);
end;
var
a: array of longint;
i, n, count: integer;
begin
read(n);
setLength(a, n);
for i := 0 to n - 1 do
read(a[i]);
mergeSort(a, 0, n - 1);
count := 1;
for i := 1 to n - 1 do
if a[i] <> a[i - 1] then
inc(count);
writeln(count);
end.
почему бы тебе не закинуть все в одно задание?)
не первый раз тебе пишу уже)
program p_4;
var
i, n, count: word;
begin
readln(n);
count := 0;
for i := 1 to n do begin
if n mod i = 0 then inc(count)
end;
writeln(count)
end.