Редактировать

ЗАДАЧА №5 Статистика

(Время: 1 сек. Память: 16 Мб Сложность: 15%)

Вася не любит английский язык, но каждый раз старается получить хотя бы четверку за четверть, чтобы оставаться ударником. В текущей четверти Вася заметил следующую закономерность: по нечетным дням месяца он получал тройки, а по четным – четверки. Так же он помнит, в какие дни он получал эти оценки. Поэтому он выписал на бумажке все эти дни для того, чтобы оценить, сколько у него троек и сколько четверок. Помогите Васе это сделать, расположив четные и нечетные числа в разных строчках. Вася может рассчитывать на оценку 4, если четверок не меньше, чем троек.

Входные данные В первой строке входного файла INPUT.TXT записано единственное число N – количество элементов целочисленного массива (1 ≤ N ≤ 100). Вторая строка содержит N чисел, представляющих заданный массив. Каждый элемент массива – натуральное число от 1 до 31. Все элементы массива разделены пробелом.

Выходные данные В первую строку выходного файла OUTPUT.TXT нужно вывести числа, которые соответствуют дням месяцев, в которые Вася получил тройки, а во второй строке соответственно расположить числа месяца, в которые Вася получил четверки. В третьей строке нужно вывести «YES», если Вася может рассчитывать на четверку и «NO» в противном случае. В каждой строчке числа следует выводить в том же порядке, в котором они идут во входных данных. При выводе, числа отделяются пробелом.

begin
  var n := ReadlnInteger;
  var a := ReadArrInteger(n);
  var s1 := a.Where(t -> t.IsOdd).Println;
  var s2 := a.Where(t -> t.IsEven).Println;
  if s1.Count > s2.Count then
    Write('NO')
  else
    Write('YES')
end.

Вначале путем фильтрации элементов массива а формируется последовательность нечетных чисел , которая выводится при помощи функции Println и запоминается в s1. Затем таким же путем формируется последовательность четных чисел s2. Далее выводится YES или NO в зависимости от результата сравнения количеств элементов в этих последовательностях.

ЗАДАЧА №9 Домашнее задание

(Время: 1 сек. Память: 16 Мб Сложность: 27%)

Петя успевает по математике лучше всех в классе, поэтому учитель задал ему сложное домашнее задание, в котором нужно в заданном наборе целых чисел найти сумму всех положительных элементов, затем найти где в заданной последовательности находятся максимальный и минимальный элемент и вычислить произведение чисел, расположенных в этой последовательности между ними. Так же известно, что минимальный и максимальный элемент встречаются в заданном множестве чисел только один раз и не являются соседними. Поскольку задач такого рода учитель дал Пете около ста, то Петя как сильный программист смог написать программу, которая по заданному набору чисел самостоятельно находит решение. А Вам слабо?

Входные данные В первой строке входного файла INPUT.TXT записано единственное число N – количество элементов массива. Вторая строка содержит N целых чисел, представляющих заданный массив. Все элементы массива разделены пробелом. Каждое из чисел во входном файле, в том числе и N, не превышает 102 по абсолютной величине.

Выходные данные В единственную строку выходного файла OUTPUT.TXT нужно вывести два числа, разделенных пробелом: сумму положительных элементов и произведение чисел, расположенных между минимальным и максимальным элементами. Значения суммы и произведения не превышают по модулю 3*104.

begin
  var n := ReadlnInteger;
  var a := ReadArrInteger(n);
  var (i1, i2) := (a.IndexMax, a.IndexMin);
  if i2 < i1 then
    Swap(i1, i2);
  Print(a.Where(t -> t > 0).Sum, Trunc(a?[i1 + 1:i2].Product))
end.

Вначале находятся индексы максимального и минимального элементов в массиве - i1 и i2. Не имеет значения, принадлежит i1 (i2) максимальному или минмальному элементу, ведь требуется только интервал [i1, i2]. Поэтому следует обеспечить выполнение условия i1 < i2. Выводится сумма элементов массив, прошедших фильтрацию по условию t > 0, и также произведение элементов, попавших в интервал [i1, i2]. Отбор элементов обеспечивается безопасным срезом. Безопасный срез не контролирует выход индекса границу массива и выполняется немного быстрее. Можно было воспользоваться и обычным срезом a[i1 + 1 : i2]. Расширение Product получает произведение элементов, попавших в срез. Поскольку Product возвращает значение типа real, пришлось использовать функцию Trunc для приведения к целому.

ЗАДАЧА №32 Годовой баланс

(Время: 1 сек. Память: 16 Мб Сложность: 35%)

В конторе «Рога и Копыта» подходит время подведения годового баланса. В бухгалтерию поступили сведения о том, что, согласно документам, суммарный расход составил а рублей, a суммарный приход – b рублей. Поскольку с реальным положением дел эти цифры все равно не имеют ничего общего, бухгалтер решил реализовать следующую свою идею. Как известно, при наборе чисел на компьютере люди часто вводят цифры в неправильном порядке. Поэтому бухгалтер хочет найти такой способ переставить цифры в числах a и b, чтобы в результате разность a-b (и, соответственно, количество денег, которые он положит к себе в карман), была максимальна, а в случае можно будет сослаться на ошибку секретаря. При этом нельзя забывать о знаке чисел и о том, что ноль не может быть первой цифрой числа, отличного от ноля. Напишите программу, которая поможет бухгалтеру.

Входные данные Входной файл INPUT.TXT содержит два целых числа a и b (-109 < a,b < 109).

Выходные данные В выходной файл OUTPUT.TXT выведите одно целое число – наибольшую разность чисел, первое из которых может быть получено перестановкой цифр a, а второе – перестановкой цифр b.

function Cnv(n: int64): int64;
begin
  if n = 0 then
  begin
    Result := 0;
    exit
  end;  
  if n > 0 then
    Result := n.ToString.SortedDescending.JoinIntoString.ToInteger
  else
  begin
    var s := Abs(n).ToString.Sorted.JoinIntoString;
    var k := 1;
    while s[k] = '0' do
      k += 1;
    s := s[k] + (k - 1) * '0' + s?[k + 1:];
    Result := -(s.ToInteger);
  end
end;
 
begin
  var (a, b) := ReadInteger2;
  Write(Cnv(a) + Cnv(-b))
end.

Наибольшая разность чисел получится, если уменьшаемое (a) будет максимально большим, а вычитаемое (b) - максимально маленьким. Следовательно, для a нужно переставить цифры в порядке невозрастания, а для b - в порядке неубывания, но при этом нули, если они будут, надо обменять местами с первой минимальной цифрой, т.е. если будет получено 00012238, надо записать 10002238. Функция Cnv преобразует число в новое, с нужным порядком следования цифр. Если значение положительное, используется алгоритм для числа “а”, если отрицательное - для числа “b”. Число приводится к строке, символы строки сортируются, образуя последовательность элементов типа char. Такая последовательность может быть приведена к строке посредством расширения JoinIntoString. Отрицательный аргумент при обращении к функции дает в результате отрицательное число, поэтому в основной программе вместо вычитания используется сложение.