Помогите подогнать решение задачи под тесты Timus Online Judge, С++

программирование с++ Тимус

Задача:

Программист Денис c детства мечтал побывать в Антарктиде, но почему-то регулярных рейсов туда нет. Поэтому Денис все лето изучал Антарктиду с помощью соседнего кинотеатра. Теперь он знает, что в Антарктиде водится несколько видов пингвинов: Императорские пингвины (Emperor Penguins) — любители петь; Малые пингвины (Little Penguins) — любители потанцевать; Пингвины Макарони (Macaroni Penguins) — любители сёрфинга.
К сожалению, в мультфильмах не было сказано, какой вид пингвинов самый многочисленный. Денис решил выяснить это: он посмотрел эти мультфильмы еще раз, и каждый раз, когда видел пингвина, записывал в блокнот название его вида. Сейчас Денис дал вам блокнот с просьбой выяснить, какой вид пингвинов самый многочисленный.
Исходные данныеВ первой строке записано целое число n — количество записей в блокноте (1 ≤ n ≤ 1000). В каждой из следующих nстрок записано по одному виду пингвинов. Среди видов встречаются только «Emperor Penguin», «Little Penguin» и «Macaroni Penguin».
РезультатВыведите самый популярный вид пингвинов. Гарантируется, что такой вид только один.


Моё решение:

#include <string>
#include <iostream>
#include <map>

using namespace std;

int main()
{
int n;
scanf("%d\n",&n);
map<char,int> peng;
peng['E']=0;
peng['M']=0;
peng['L']=0;

string tmp="";

for(int i=0;i<n;i++) {
getline(cin,tmp);
if(tmp[0]=='E' || tmp[0]=='M' || tmp[0]=='L') peng[tmp[0]]++;
}
map<char,int>::reverse_iterator rit = peng.rbegin();
switch(rit->first) {
case 'E': cout<<"Emperor Penguin"<<endl;break;
case 'M': cout<<"Macaroni Penguin"<<endl;break;
case 'L': cout<<"Little Penguin"<<endl;
}
return 0;
}

Это решение выдает WA на втором тесте, в чем может быть ошибка?

Примечание:
UPD: Решил без map.

#include <string>
#include <iostream>

using namespace std;

int main()
{
int n;
cin>>n;
int i_peng[3]={0};
char c_peng[3];
c_peng[0]='M';
c_peng[1]='L';
c_peng[2]='E';

string tmp="";
cin.ignore(100,'\n');
for(int i=0;i<n;i++) {
getline(cin,tmp);
if(tmp[0]=='M') i_peng[0]++;
if(tmp[0]=='L') i_peng[1]++;
if(tmp[0]=='E') i_peng[2]++;
}
int max=0;
if(i_peng[0]<i_peng[1]) max=1;
if(i_peng[max]<i_peng[2]) max=2;
switch(c_peng[max]) {
case 'E': cout<<"Emperor Penguin"<<endl;break;
case 'M': cout<<"Macaroni Penguin"<<endl;break;
case 'L': cout<<"Little Penguin"<<endl;
}
return 0;
}
Ответы:
map сортируется по ключу, а не по значению, поэтому rit->first всегда будет выдавать 'E'. Определить наибольшее из трех чисел можно и без использования stl.


10 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.