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

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

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

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

Ответы

Ответ дал: Koljisto
0

Полагаю ответ кроется в нахождении элемента в этом списке, который и повторяется ровно столько количество раз, скольки и равен индекс данного выражения. Т.е. если у нас 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;

}

Вас заинтересует