2008, TCHS, Весна, Раунд 1, Зачисление студентов

(StudentEnrollment)

 

Массив names содержит названия предметов, которые следует сдавать абитуриентам. Массив spaces содержит количество свободных мест на данный момент для каждого предмета. То есть еще spaces[i] абитуриентов может записаться на сдачу предмета names[i]. Массив queries содержит запросы – названия предметов, на сдачу которых хотят записаться новые абитуриенты. Для каждого запроса следует или записать абитуриента на курс, или отказать, сообщив ему что либо нет свободных мест, либо нет в наличии требуемого курса. Для каждого запроса следует вернуть одну из строк:

1. Если на требуемый предмет есть свободные места, то вернуть “GOOD”;

2. Если на требуемый предмет не осталось свободных мест, то вернуть “NOT GOOD”;

3. Если требуемого предмета не существует, вернуть “DOES NOT EXIST”.

 

Класс: StudentEnrollment

Метод: vector<string> checkClasses(vector<string> names, vector<int> spaces, vector<string> queries)

Ограничения: каждый из массивов names и queries содержит от 0 до 50 строк, каждая из которых содержит от 1 до 50 символов ‘A’ – ‘Z’, все элементы names разные.

 

Вход. Массивы names, spaces и queries.

 

Выход. Массив строк, содержащий результаты запросов в соответствии с описанными в условии задачи правилами.

 

Пример входа

names

spaces

queries

{"MATH", "ENGLISH"}

{1, 2}

{"ENGLISH", "MATH", "MATH"}

{"MATH", "ENGLISH"}

{2, 0}

{"ENGLISH", "MATH", "MATH"}

{"MATH", "ENGLISH"}

{2, 0}

{"ENGLISH", "FRENCH"}

 

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

{"GOOD", "GOOD", "NOT GOOD"}

{"NOT GOOD", "GOOD", "GOOD"}

{"NOT GOOD", "DOES NOT EXIST"}

 

 

РЕШЕНИЕ

структуры данных

 

В отображении map<string,int> m будем хранить информацию о предметах и количестве свободных для их сдачи мест. Например, если m["MATH"] = 2, то на математику может записаться еще два абитуриента. Используя массивы names и spaces, заполняем m. Для удобства дальнейшей обработки количество свободных мест для каждого предмета увеличим на 1.

Проходим по массиву queries. Если на предмет queries[i] еще можно записать абитуриента, то заносим “GOOD” в результирующий массив res, а значение m[queries[i]] уменьшаем на 1. Если на текущий момент m[queries[i]] равно 1, то свободные места закончились. Если m[queries[i]] равно 0, то предмета queries[i] не существует.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

#include <map>

using namespace std;

 

map<string,int> m;

 

class StudentEnrollment

{

public:

  vector<string> checkClasses(vector<string> names, vector<int> spaces,

                              vector<string> queries)

  {

    int i;

    vector<string> res;

    for(i=0;i<names.size();i++) m[names[i]] = spaces[i]+1;

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

    {

      if (m[queries[i]] == 0) res.push_back("DOES NOT EXIST"); else

      if (m[queries[i]] == 1) res.push_back("NOT GOOD"); else

      {

        res.push_back("GOOD");

        m[queries[i]]--;

      }

    }

    return res;

  }

};