Матч 361, Белые шляпы (WhiteHats)

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

 

В комнате находится несколько людей. На каждом одета белая или черная шляпа. Каждый человек подсчитывает количество белых шляп, которое он видит на головах других. Элемент count[i] содержит число белых шляп, подсчитанных i - ым человеком. Вычислить число людей, носящих белые шляпы или -1, если входные данные не могут соответствовать реальной ситуации.

 

Класс: WhiteHats

Метод: int whiteNumber(vector<int> count)

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

 

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

 

Выход. Число людей, носящих белые шляпы или -1, если входные данные соответствуют реальной ситуации.

 

Пример входа

count

{2,1,1}

{2,2,2}

{10,10}

 

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

2

3

-1

 

РЕШЕНИЕ

математика

 

Пусть в комнате находится len людей и пусть a из них носит белые шляпы. Тогда a людей (те, на ком находятся белые шляпы) при подсчете должны выдать результат в a – 1 шляп (так как они не видят единственной шляпы, находящуюся у них на голове), а остальные  len a людей, которые носят черные шляпы, должны дать результат в a белых шляп.

Отсортируем массив чисел count. Положим в b наименьший элемент массива, а в w – наибольший.  Если они равны, то черных шляп ни у кого нет. При этом значение b (или w) должно быть на 1 меньше чем len. В таком случае возвращаем len. Допустимая ситуация может быть еще в одном случае – когда b отличается от w на 1. Если это не так, то возвращаем -1. Иначе массив count имеет вид w, w, , …, w, b, b, …, b. Находим позицию pos, с которой в массиве count начинаются значения b. При этом в комнате будет находиться в точности pos людей с белыми шляпами, если pos = count[pos]. Последнее равенство означает, что человек в черной шляпе должен насчитать в точности pos людей в белых шляпах.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <algorithm>

using namespace std;

 

class WhiteHats

{

public:

  int whiteNumber(vector<int> count)

  {

    sort(count.begin(),count.end());

    int len = count.size(),w = count[len-1],b = count[0];

    if ((w == b) && (w + 1 == len)) return len;

    if (w - b > 1) return -1;

    int pos = (int)(find(count.begin(),count.end(),w) - count.begin());

    if (pos == count[pos]) return pos;

    return -1;

  }

};