М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
shasherina13ozz1hj
shasherina13ozz1hj
24.07.2020 08:00 •  Информатика

Задание 27 (Е. Джобс) Дана последовательность N целых неотрицательных чисел. Необходимо определить количество пар положительных элементов этой последовательности, сумма которых четна, при этом между элементами пары есть хотя бы один ноль.
Входные данные. Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке натуральное число N (1 < N < 10000) – количество чисел в последовательности. В следующих N строках записаны числа, входящие в последовательность, по одному в каждой строке.
Выходные данные: Программа должна вывести одно число – количество найденных пар.
Пример входного файла:
6
2
1
4
0
3
4
Для указанных входных данных искомое количество пар равно 3.
В ответе укажите два числа: сначала искомое значение для файла А, затем для файла B.
, не знаю как решить

👇
Ответ:
micser2017
micser2017
24.07.2020

even, odd = [0], [0]

pointer = 0

prev_0 = True

answer = 0

n = int(input())

for i in range(n):

   num = int(input())

   if num == 0 and not(prev_0):

       even.append(0)

       odd.append(0)

       pointer += 1

       prev_0 = True

   elif num == 0 and prev_0:

       continue

   else:

       prev_0 = False

       if num % 2 == 0:

           even[pointer] += 1

       else:

           odd[pointer] += 1

for i in range(len(even)):

   for j in range(i+1, len(even)):

       answer += even[i] * even[j]

for i in range(len(odd)):

   for j in range(i+1, len(odd)):

       answer += odd[i] * odd[j]

print(answer)

Объяснение:

Разделим последовательность на своеобразные блоки, где разделители — это один или несколько подряд идущих нулей. В каждом блоке посчитаем количество чётных и нечётных чисел. Сумма чётна, если оба числа в паре либо чётны, либо нечётны. Значит, число нужных пар в некоторых двух блоках — это произведение количества чётных в первом блоке и во втором блоке + произведение количества нечётных в первом блоке и во втором блоке. Тогда ответом будет сумма всех возможных таких попарных произведений среди всех блоков.

При реализации программы алгоритм будет выглядеть так: создадим два массива, где будем сохранять количество чётных и нечётных чисел в каждом блоке. Блоком будет элемент массива. Также создадим указатель, чтобы чётные и нечётные числа считались в нужный блок. Если встречается 0 и до этого нулей не было, нужно создать новый блок, то есть добавить к массивам новую ячейку и переместить указатель на неё. Если же нули до этого нуля были, то просто пропустим данный шаг, чтобы не захламлять массив (поэтому стоит объявить флаг prev_0 именно как True, чтобы пропустить нули в начале, если они есть). Как только встречается положительное число, увеличиваем число в нужном блоке на один. После окончания ввода считаем все возможные попарные произведения в массиве чётных и нечётных чисел.

Программа эффективна по памяти, так как размеры массивов ограничены числом N ≤ 10000, а также эффективна по времени, так как все данные считываются в один проход, а каждый из последних циклов сделает меньше 10000² операций, что для компьютера довольно немного.

4,6(81 оценок)
Открыть все ответы
Ответ:
arisha72
arisha72
24.07.2020
Какую операционную систему используешь? если Linux то:
1) g++ -c mprog.cpp -o mprog.o (-o "output" - файл вывода, -c означает "только компиляция", т.е. не связывать твой файл со сторонними билиотеками типа libc, получим просто файл с машинными командами особо ни к чему не привязанный ".o" - object file, если особо интересно, что же там лежит, можно вызвать "objdump -D mprog.o" либо g++ -S -masm=intel -O0 mprog.cpp, вывод будет в mprog.s)
2) g++ -c prog.cpp -o prog.o (то же самое)
3) g++ prog.o mprog.o -o prog (выполняем связывание двух обектных файлов между собой и со стандартными библиотеками, опять же новое содержимое можно посмотреть "objdump -D mprog")
4) ./prog - запустить твою программу и передать управление в начало функции main (и не важно, в каком файле она лежала, главное, чтобы была одна, хотя иначе шаг 3 выдаст ошибку)
Если винда, то запусти поиск по диску С "mingw32-g++.exe" и через командную строку вызывай для него
1) ...путь...\mingw32-g++.exe -c mprog.cpp -o mprog.o
2) ...путь...\mingw32-g++.exe -c prog.cpp -o prog.o
3) ...путь...\mingw32-g++.exe prog.o mprog.o -o prog.exe 
4) prog.exe
4,7(80 оценок)
Ответ:
misik1
misik1
24.07.2020
//Pascal ABC.NET 3.1 сборка 1256

Var
 s,s1:string;
begin
readln(s);
if (s[1]='в') and (s[2]=' ') then
 begin
  delete(s,1,1);
  s:='на'+s;
 end;
if (s[1]='В') and (s[2]=' ') then
 begin
  delete(s,1,1);
  s:='На'+s;
 end;
while pos(' в ',s)<>0 do
 begin
  if (s[1]='в') and (s[2]=' ') then
 begin
  delete(s,1,1);
  s:='на'+s;
 end;if (s[1]='В') and (s[2]=' ') then
 begin
  delete(s,1,1);
  s:='На'+s;
 end;
  s1:=s1+copy(s,1,pos(' в ',s)-1)+' на ';
  delete(s,1,pos(' в ',s)+2);
 end;
  if (s[1]='в') and (s[2]=' ') then
 begin
  delete(s,1,1);
  s:='на'+s;
 end;
if (s[1]='В') and (s[2]=' ') then
 begin
  delete(s,1,1);
  s:='На'+s;
 end;
s:=s1+s;
writeln(s);
end.

Пример ввода 1:
запасти в зиму, приехать в год, приготовить в день, выпить лекарство в ночь
Пример вывода 1:
запасти на зиму, приехать на год, приготовить на день, выпить лекарство на ночь

Пример ввода 2(глубокие песни современной отечественной эстрады):
В в в в в в в в в в в в в в в в в в н.
Пример вывода 2:
На на на на на на на на на на на на на на на на на на н.
4,8(94 оценок)
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ