Матч 381, Наилучшее имя (TheBestName)

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

 

Определим функцию сравнения имен. Припишем вес каждой букве: ‘A’ – 1, ‘B’ – 2, …, ‘Z’ – 26. Вес имени равен сумме весов букв, входящих в него. Имя с большим весом более значимо чем имя с меньшим весом. Среди имен с одинаковым весом более значимым является то, которое идет лексикографически раньше. При этом нет лучшего имени чем JOHN, имя JOHN всегда является наиболее значимым.

Отсортировать входной массив имен в порядке убывания их значимости.

 

Класс: TheBestName

Метод: vector<string> sort(vector<string> names)

Ограничения: names содержит от 1 до 50 строк,  names[i] содержит от 1 до 50 заглавных букв латинского алфавита ‘A’ – ‘Z’.

 

Вход. Массив имен names.

 

Выход. Массив имен в порядке убывания их значимости.

 

Пример входа

names

{"JOHN", "PETR", "ACRUSH"}

{"JOHN", "A", "AA", "AAA", "JOHN", "B", "BB", "BBB", "JOHN", "C", "CC", "CCC", "JOHN"}

{"BATMAN", "SUPERMAN", "SPIDERMAN", "TERMINATOR"}

 

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

{"JOHN", "ACRUSH", "PETR"}

{"JOHN","JOHN","JOHN","JOHN","CCC","BBB","CC","BB","AAA","C","AA","B","A"}

{"TERMINATOR", "SUPERMAN", "SPIDERMAN", "BATMAN"}

 

 

РЕШЕНИЕ

сортировка

 

Задача сводится к написанию функции сортировки строк f согласно заданным условиям. Строки a и b меняются местами при вызове f(a, b), если функция f возвращает ложь. Значимость имени JOHN отобразим следующим фактом: если a = JOHN, то вернем 1 (переставлять a и b не надо), если b = JOHN, то вернем 0 (a и b следует переставить).

Функция sum вычисляет вес имени. Если имя a имеет больший вес, чем b, то возвращаем 1 (a и b не переставляем). В случае равенства весов лексикографически сравниваем строки, возвращая значение a < b. В остальных случаях функция f возвращает 0.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

 

int sum(string s)

{

  int i,res;

  for(res=i=0;i<s.size();i++)

    res += (s[i] - 'A' + 1);

  return res;

}

 

// true, not to swap

int f(string a, string b)

{

  if (a == "JOHN") return 1;

  if (b == "JOHN") return 0;

  if (sum(a) > sum(b)) return 1;

  if (sum(a) == sum(b)) return a < b;

  return 0;

}

 

class TheBestName

{

public:

  vector<string> sort(vector<string> names)

  {

    std::sort(names.begin(),names.end(),f);

    return names;

  }

};