Профессор андрей сергеевич ведет урок логики. однажды, он записал следующие выражения на доске:

ровно a1 из этих выражений верны.
ровно a2 из этих выражений верны.
ровно a3 из этих выражений верны.

ровно an из этих выражений верны.
андрей сергеевич спросил класс: сколько из этих утверждений верны? классу, найдите максимальное количество утверждений, которое может быть верно. если правильного ответа не существует, выведите -1.

входные данные
первая строка содержит число n (1 ≤ n ≤ 50) — количество утверждений. следующая строка содержит n чисел ai (0 ≤ ai ≤ n) — числа в утверждениях андрея сергеевича.

выходные данные
выведите одно число — максимальное количество верных утверждений на доске.
на языке с++ и только
100

An0NimKa00 An0NimKa00    1   04.11.2019 16:25    14

Ответы
xxx5639 xxx5639  10.10.2020 11:12

Полагаю ответ кроется в нахождении элемента в этом списке, который и повторяется ровно столько количество раз, скольки и равен индекс данного выражения. Т.е. если у нас 5 утверждений, то утверждение с "1" будет правдиво для себя же. Если у нас будет 2 утверждения с двойками, то они могут ссылаться друг на друга соответственно.

Если будет четыре "4", то они также могут ссылаться друг на друга, что они правдивы и тогда можно заверить, что они верны.

Программа (C++):

#include <iostream>

#include <map>

using namespace std;

int main()

{

setlocale(LC_ALL, "Russian");

int result=0;

int n, elem;

list<int> list_elems;

map<int, int> elems_map;

   cout << "Введите N\n";

cin >> n;

cout << "Введите числа в утверждениях\n";

for (int i = 0; i < n; i++) {

 cin >> elem;

 list_elems.push_back(elem);

}

for (auto const& f : list_elems)

 elems_map[f]++;

for (auto const& b : elems_map) {

 if (b.first == b.second && result < b.first)

  result = b.first;

}

if (result == 0)

 cout << -1;

else

 cout << result << " правдивы";

return 0;

}

ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика