Матч 226, Анализ Эксперимента (ExperimentalAnalyzer)

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

 

Проводятся эксперименты, зависящие от нескольких параметров. Результатом эксперимента является значение 0 или 1. Параметр является независимым, если существует такое пороговое значение t, для которого все значения с результатом 0 лежат больше (меньше) него, а с результатом 1 меньше (больше) него.

Имеется массив строк, содержащих результаты экспериментов. Первым числом в каждой строке является результат эксперимента (0 или 1). Далее следуют значения параметров. Необходимо установить, какие параметры в эксперименте являются независимыми.

 

Класс: ExperimentalAnalyzer

Метод: vector<int> getPredictors(vector<string> data)

Ограничения: data[i] содержит от 3 до 50 символов, data[i] содержит результат эксперимента (0 или 1) и значения параметров (от 0 до 2147483647 включительно), все элементы data[i] содержат одинаковое количество чисел.

 

Вход. Массив строк data.

 

Выход. Массив, содержащий индексы независимых параметров. Индексы параметров нумеруются с единицы.

 

Пример входа

data

{"0 10 20 20 0", "1 20 30 17 98765", "0 10 30 29 1234567", "1 20 40 10 42"}

{"1 220 212 247 764 928 956 946 66 640 983 125 994",

"0 816 835 98 81 783 267 946 584 309 757 876 670"}

 

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

{1, 3}

{}

 

 

РЕШЕНИЕ

обработка массива

 

Для каждого параметра и для каждого исхода (0 или 1) найдем наибольшее и наименьшее его значение. Таким образом, для каждого параметра получим интервалы, в которых находятся его значения для исхода 0 и для исхода 1. Если эти интервалы не пересекаются, то параметр считается независимым. Если в эксперименте в качестве результата присутствует только 0 (или 1), то все параметры считаются зависимыми.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <sstream>

#include <vector>

using namespace std;

 

class ExperimentalAnalyzer

{

public:

  vector<int> getPredictors(vector<string> data)

  {

    vector<int> res;

    int i, j, min[2][51], max[2][51], outcome, value;

    for(i = 0; i < 51; i++) min[0][i] = min[1][i] = 2147483647;

    memset(max,0,sizeof(max));

    for(i = 0; i < data.size(); i++)

    {

      stringstream in(data[i]); 

      in >> outcome; j = 0;

      while (in >> value)

      {

        if (value < min[outcome][j]) min[outcome][j] = value;

        if (value > max[outcome][j]) max[outcome][j] = value;

        j++;

      }

    }

    for(i = 0; i < j; i++)

    {

      if ((min[0][i] == 2147483647) || (min[1][i] == 2147483647)) continue;

      if (!((max[0][i] >= min[1][i]) && (min[0][i] <= max[1][i])))

         res.push_back(i+1);

    }

    return res;

  }

};