Матч 378, Истинные выражения (TrueStatements)

Дивизион 2, Уровень 2; Дивизион 1, Уровень 1

 

Профессор Смит учит студентов логике. Он записал набор выражений:

В точности a из этих выражений истинны;

В точности b из этих выражений истинны;

В точности c из этих выражений истинны;

. . .

Числа a, b, c, … заданы в массиве statements. Необходимо определить, сколько их этих выражений истинны. Если этого установить невозможно, вернуть -1. Если ответов может быть несколько, то вернуть наибольший.

 

Класс: TrueStatements

Метод: int numberTrue(vector<int> statements)

Ограничения: statements содержит от 1 до 50 элементов, 1 £ statements[i] £ 50.

 

Вход. Массив, описывающий числа в приведенных выше логических выражениях.

 

Выход. Наибольшее возможное количество истинных выражений.

 

Пример входа

statements

{0, 1, 2, 3}

{0}

{0, 3, 1, 3, 2, 3}

{1, 1}

 

Пример выхода

1

-1

3

0

 

 

РЕШЕНИЕ

элементарные вычисления

 

Максимальное количество истинных выражений может принимать значение от 0 до statements.size(). Перебираем это количество в цикле по i, начиная с наибольшего возможного значения. Для каждого значения i подсчитываем количество statements[j], равных i. Если это количество равно i, то в точности i выражений истинны. Если ни одно из перебираемых значений i не подходит, то возвращаем -1.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <algorithm>

using namespace std;

 

class TrueStatements

{

public:

  int numberTrue(vector<int> statements)

  {

    int i;

    for(i = statements.size(); i >= 0; i--)

      if (count(statements.begin(),statements.end(),i) == i) return i;

    return -1;

  }

};