Условие
Задача взята с сайта e-olymp. Полное условие можно прочитать здесь.
Входные данные
В первой строке задано количество [latex]N[/latex] орков, участвующих в игрищах. Далее идет [latex]N[/latex] строк с речью соответствующего орка. Гарантируется, что речь каждого Орка находится в одной строке, и в игрищах принимает участие не менее одного и не более [latex]100[/latex] орков. Количество символов в каждой записанной речи орка не превышает [latex]1000[/latex] и не менее одного.
Из условия:
«…теперь в их алфавите в качестве гласных использовались только буквы «а», «o», «e», «u».»
«…орки иногда устраивали состязания в красноречии. При этом расходы их энергии были тем больше, чем меньше отношение количества слогов к количеству слов в произнесенной речи.»
«Самым «Годистым» орком считался тот из них, у кого это отношение было наименьшим, а в случае равенства этого показателя тот, у кого в произнесенной речи было больше сказано слов. Ваша задача – определить Орка года по заданному критерию.»
Выходные данные
Единственное число – номер Орка, признанного Орком Года. В случае, если однозначно определить победителя невозможно, вывести "O-o-o-rks...".
Решение
Напишем 2 функции: int countSyllables(char* speech), которая будет считать гласные (т.к. кол-во слогов всегда равно кол-ву гласных), и int countWords(char* speech), считающую кол-во слов. Для написания первой воспользуемся стандартной функцией strpbrk(), для второй — функцией strtok(). Для каждой считанной строки будем по очереди вызывать эти 2 функции и заносить полученные значения в соответствующие массивы syllables и words (вызывать будем именно в таком порядке, т.к. функция strtok() делает строку непригодной к дальнейшему использованию).
Далее, чтобы избежать работы с вещественными числами (что может привести к потере точности) будем сравнивать полученные результаты согласно требованиям, но вместо деления воспользуемся соотношением пропорции. Заведем переменную-флаг ambiguous, показывающую, однозначен ли победитель. В зависимости от ее значения, выведем номер победителя (переменная winner, по умолчанию победитель — первый орк) или строку "O-o-o-rks..."
Тесты
№ | Входные данные | Выходные данные |
1 | 2 Hello, World! Ok. |
2 |
2 | 3 Ooh, hey there 😀 Hello, World of me! Will be ambiguous??? |
O-o-o-rks… |
3 | 4 Some people like C! Some say Java is better. Heh, or maybe Python? Who knows for sure? |
O-o-o-rks… |
4 | 5 A Lannister always pays his debts. Winter is coming… Hear me roar! King of the North! Sherlock? |
1 |
5 | 8 O-o-o-rks… Is not the same as… O-o-o-rks! or O-o-orks… …trust me,… …when writing code, one must be extremely careful! …beware! |
O-o-o-rks… |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <iostream> #include <cstring> #define SIZE 1001 using namespace std; int countWords(char* speech) { int wordCount = 0; char delim[] = " ,.!?:;-\"\'"; char* pointer = strtok(speech, delim); while (pointer != NULL) { pointer = strtok(NULL, delim); wordCount++; } return wordCount; } int countSyllables(char* speech) { int syllableCount = 0; char vowels[] = "aoeuAOEU"; char* pointer = strpbrk(speech, vowels); while (pointer != NULL) { pointer = strpbrk(pointer + 1, vowels); syllableCount++; } return syllableCount; } int main() { int n; cin >> n; char speech[SIZE]; int words[n]; int syllables[n]; cin.ignore(); //пропустить перевод строки между числом и первой речью for (int i = 0; i < n; i++) { cin.getline(speech, SIZE); syllables[i] = countSyllables(speech); words[i] = countWords(speech); } bool many = false; int winner = 0; for (int i = 1; i < n; i++) { if (syllables[i] * words[winner] < syllables[winner] * words[i]) { winner = i; many = false; } else if (syllables[i] * words[winner] == syllables[winner] * words[i]) { if (words[winner] < words[i]) { winner = i; many = false; } else if (words[winner] == words[i]) many = true; } } if (many) cout << "O-o-o-rks..."; else cout << winner + 1 << endl; return 0; } |
Ссылки
Код на ideaone.
Засчитанное решение на e-olymp.
Засчитано. Хорошо