НиколаевнаФ
?>

Напишите программу, которая в последовательности натуральных чисел определяет сумму трёхзначных чисел, кратных 4. (0 – признак окончания ввода, не входит в последовательность количество чисел не превышает 1000. введённые числа не превышают 30 000.

Информатика

Ответы

petrovichvit2933

c++ / gcc 7.3.0

#include <iostream>

#include <algorithm>

#include <vector>

int main()

{

   unsigned short int N;

   unsigned int result = 0;

   std::cin >> N;


   std::vector<unsigned short int> arr;


   while(true)

   {

       unsigned short int tmp;

       std::cin >> tmp;

       if(tmp != 0)

           arr.push_back(tmp);

       break;

   }

   std::for_each(arr.cbegin(), arr.cend(), [&result](auto& var)

   {

       if(var > 99 && var < 1000 && (var % 4 == 0))

           result += var;

   });

   std::cout << result << std::endl;

   return 0;

}



Напишите программу, которая в последовательности натуральных чисел определяет сумму трёхзначных чисе
marimelons795
Каждая из компонент связности должна быть кликой (иначе говоря, каждые две вершины в одной компоненте связности должны быть связаны ребром). Если в i-ой компоненте связности n_i вершин, то общее число рёбер будет суммой по всем компонентам связности:

\displaystyle \sum_{i=1}^K\frac{n_i(n_i-1)}2=\frac12\sum_{i=1}^K n_i^2-\frac12\sum_{i=1}^Kn_i=\frac12\sum_{i=1}^K n_i^2-\frac N2

Требуется найти максимум этого выражения (т.е. на самом деле - максимум суммы квадратов) при условии, что сумма всех ni равна N и ni - натуральные числа.

Если K = 1, то всё очевидно - ответ N(N - 1)/2. Пусть K > 1.

Предположим, n1 <= n2 <= ... <= nK - набор чисел, для которых достигается максимум, и n1 > 1. Уменьшим число вершин в первой компоненте связности до 1, а оставшиеся вершины "перекинем" в K-ую компоненту связности. Вычислим, как изменится сумма квадратов:
\Delta(\sum n_i^2)=(1^2+(n_K+n_1-1)^2)-(n_1^2+n_K^2)=2(n_1-1)(n_K-1)
Поскольку по предположению n1 > 1 (тогда и nK > 1), то сумма квадратов увеличится, что противоречит предположению о том, что на выбранном изначально наборе достигается максимум. Значит, максимум достигается, если наименьшая по размеру компонента связности - изолированная вершина. Выкинем эту компоненту связности, останутся K - 1 компонента связности и N - 1 вершина. Будем продолжать так делать, пока не останется одна вершина, тогда получится, что во всех компонентах связности кроме последней должно быть по одной вершине.

Итак, должно выполняться
n_1=n_2=\cdots=n_{K-1}=1;\qquad n_K=N-K+1

Подставив в исходную формулу, получаем
\displaystyle\frac{(N-K)(N-K+1)}{2}

Это и есть ответ.
ВасилийМалюга152
// PascalABC.NET 3.0, сборка 1128
procedure Convert(V:array of integer);
begin
  for var i:=0 to V.Length-1 do
    if V[i]>9 then V[i]:=9
    else
      if V[i]<5 then V[i]:=5
end;

procedure Develop(c:char; k:integer);
begin
  WritelnFormat('*** Массив {0} ***',c);
  var a:=ArrRandom(k,-5,15);
  Write('исходный : '); a.PrintLn(',');
  Convert(a);
  Write('результат: '); a.PrintLn(',');
end;

begin
  var m:=ReadInteger('Количество элементов в массиве A:');
  var n:=ReadInteger('Количество элементов в массиве B:');
  Develop('A',m);
  Develop('B',n)
end.

Тестовое решение:
Количество элементов в массиве A: 15
Количество элементов в массиве B: 10
*** Массив A ***
исходный : 6,5,-5,9,1,0,-3,9,13,12,-4,8,11,14,-5
результат: 6,5,5,9,5,5,5,9,9,9,5,8,9,9,5
*** Массив B ***
исходный : 5,12,12,4,7,9,7,-3,-1,-2
результат: 5,9,9,5,7,9,7,5,5,5

Ответить на вопрос

Поделитесь своими знаниями, ответьте на вопрос:

Напишите программу, которая в последовательности натуральных чисел определяет сумму трёхзначных чисел, кратных 4. (0 – признак окончания ввода, не входит в последовательность количество чисел не превышает 1000. введённые числа не превышают 30 000.
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

annaar497
Ruzalina_Svetlana1435
Nikolaevich-Svetlana388
Анатольевна
nailya-abdulova25
zapros
leonid-adv70
Shevtsov1818
Khlustikova_Borisovna
Мелконян1137
ulyana-d
mail9
andreevaanastsiyao82
Fedorov1283
ipaskarovanv6