Как оптимизировать решение?

программирование оптимизация информатика С++ ЕГЭ

До экзамена осталось 9 дней, с репетитором занимался только 3 раза, так стал искать слишком поздно, а потом она уехала из города. Сейчас решаю варианты сам. Вот задание С4, сделанное на компьютере за 2 часа (долго тыркался со строками, пока не перешёл на string). Вроде бы сделал, но не покидает ощущение, что сделал хреново. Как это всё поместится в виде листинга?! Ведь на ЕГЭ компьютеров не будет. Может, возможно как-то оптимизировать код?
Суть задачи: на вход подаётся N строк вида <Фамилия> <Имя> <Класс> <Предмет>.
Нужно вывести список учеников, сдающих каждый предмет (т.е. Химию сдаёт столько-то человек + список, физику - столько-то, список и т.д.) и предмет, который сдаёт максимальное кол-во учеников. Предметов не более 10, учеников не более 300. Решение прилагается

#include <fstream> // компилятор Dev-C++ 4.9.8.0
#include <iostream>
using namespace std;
class StupidKid{
public:
char surname[21];
char name[13];
char clAss[4];
char subject[13];
};
int N; // количество записей
int numberOfSubj; // количество предметов
int iSubj[10]; // количество сдающих учеников
string chSubj[10]; // названия предметов
string currentSubj;
int main(){
cin >> N;
StupidKid rec[N];
for(int i=0;i<N;i++){ // записываем данные
cin.getline(rec[i].surname, sizeof(rec[i].surname), ' ');
cin.getline(rec[i].name, sizeof(rec[i].name), ' ');
cin.getline(rec[i].clAss, sizeof(rec[i].clAss), ' ');
cin.getline(rec[i].subject, sizeof(rec[i].subject), '.');
if(numberOfSubj==0){ // если это первая запись
chSubj[0]=rec[i].subject;
iSubj[0]=1;
numberOfSubj++;
continue;
}

int j=0; // счётчик проверенных предметов
currentSubj=rec[i].subject;
for(;j<numberOfSubj;j++){ // пока не проверили все уже известные предметы
if(chSubj[j]==currentSubj){
iSubj[j]++; // увеличиваем количество сдающих
break;
}
}

// если совпадений всё же не нашлось
if(j==numberOfSubj){
chSubj[numberOfSubj]=currentSubj; // добавляем новый предмет
iSubj[numberOfSubj]=1;
numberOfSubj++;
}
}

// найти максимальный элемент iSubj[j]
int max=iSubj[0];
for(int i=0;i<N;i++){
if(iSubj[i]>max){ max=iSubj[i]; }
}

// вывод
for(int i=0;i<10;i++){
if(iSubj[i]==0){break;}
cout << "Предмет " << chSubj[i] << " " << iSubj[i] << " учащихся";
// ищем учеников, сдающих этот предмет
for(int j=0;j<N;j++){
currentSubj=rec[j].subject;
if(chSubj[i]==currentSubj){
cout << rec[j].surname << " " << rec[j].clAss;
}
}
cout << endl;
}
cout << "Самое большое количесвто учащихся - " << max << " выбрали предметы:"
<< endl;
for(int i=0;i<N;i++){
if(max==iSubj[i]){
cout << chSubj[i];
}
}
system("PAUSE");
return 0;
}

Примечание:
Это единственное, что я знаю :) Ну ещё ActionScript 3
Странно, у меня всё работает. Какой компилятор, какие ошибки?

Примечание:
Спасибо, буду учить STL :-)
Ответы:
Re: возможно как-то оптимизировать код?
Нет. Он не работает.
Когда это стали на ЕГЭ c++ сдавать?
Можешь в классе StupidKid хранить не само название предмета, а индекс, ссылающийся на массив chSubj. Ну и сделать отдельную функцию, которая по названию предмета возвращает его индекс в это массиве. Так удобней на мой взгляд. Что-то типа
int getSubjId(string subjName) {
 for (int i = 0; i < numberOfSubj; i++) {
   if (chSubj[i] == subjName) return i;
 }
 chSubj[numberOfSubj++] = subjName;
 return numberOfSubj - 1;
}
#1: gcc ошибка: нет декларации ‘system’ в этой области видимости
StupidKid rec[N]; - так лучше не делать, если N не константа.
Замени на StupidKid* rec = new StupidKid[N]; и добавь delete[] rec; в конце программы.


14 лет назад

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

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

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