#cpp #инспекция_кода
Помогите разобраться где может быть недоработка и каким образом можно ускорить работу кода? #include#include #include using namespace std; struct Student { char fam[20]; char name[20]; int howMOc = 0; //как много оценок(размер для массива *ocenki ) int* ocenki; //помещаем double srBal = 0; }; int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); setlocale(0, "rus"); int howMStud = -1; int howMSubj; int pasScore = -1; //прох балл cin >> howMStud; if ((howMStud > 10000) || (howMStud < 1)) exit(0); Student* postup = new Student[howMStud]; for (int i = 0; i < howMStud; i++) { cin >> postup[i].fam; cin >> postup[i].name; cin >> howMSubj; if ((howMSubj > 50) || (howMSubj < 1)) exit(0); postup[i].howMOc = howMSubj; postup[i].ocenki = new int[howMSubj]; for (int j = 0; j < howMSubj; j++) { cin >> postup[i].ocenki[j]; postup[i].srBal += postup[i].ocenki[j]; }//for j postup[i].srBal = postup[i].srBal / howMSubj; }//for i cin >> pasScore; //Вывод for (int i = 0; i < howMStud; i++) { if (postup[i].srBal >= pasScore) { cout << postup[i].fam << " " << postup[i].name; cout << endl; }//end if }//end i //system("pause"); return 0; }
Ответы
Ответ 1
Из того что я вижу в этом коде: (WA) при вычислении среднего от 50: 10^9 10^9 ... 10^9 вы получите целочисленное переполнение, рекомендую использовать тип long long (у вас может и 64 бита но не факт что там так же). (TL) работа с cin/cout оочень медленная. Есть разные способы исправить это, можете читать через scanf/printf, можно использовать магические строки cout.tie(0); iostream::sync_with_stdio(0); рекомендую статью http://codeforces.com/blog/entry/5217?locale=ru (адаптация под олимпиады). (WA/UB) размер строки 20 символов, но не 21 (а нуль символ?) Отвыкайте использовать динамическую память на олимпиадах без реальной необходимости, лучше задать массив сразу размера 10.000 и всё. Больше не меньше. (ML) не храните массив с оценками только само среднее значение, массив используйте общий для всех студентов. Так код с виду рабочий.Ответ 2
Откровенно говоря, странно, что проблема по времени. Если это на e-olymp, то там же дают целую секунду - это же вечность :) Вот этот код просвистел на ура: #include#include #include #include #include using namespace std; struct Data { char name[48]; unsigned int cnt; unsigned int avg; unsigned int rem; Data():cnt(0),avg(0),rem(0){}; }; int main(int argc, const char * argv[]) { vector ds; int N = 0; ifstream in("input.txt"); in >> N; string s; s.reserve(24); ds.reserve(N); for(int i = 0; i < N; ++i) { Data d; in >> s; strcpy(d.name,s.c_str()); in >> s; strcat(d.name," "); strcat(d.name,s.c_str()); in >> d.cnt; for(int j = 0; j < d.cnt; ++j) { unsigned int v; in >> v; d.rem += v%d.cnt; d.avg += v/d.cnt; } ds.push_back(d); } int K; in >> K; ofstream out("output.txt"); for(int i = 0; i < N; ++i) { if (ds[i].avg + ds[i].rem/ds[i].cnt >= K) out << ds[i].name << endl; } } Ответ 3
Сразу же можно заметить, что не нужно в принципе выделять память для хранения структур. Получите сначала проходной балл, а потом в цикле проверяйте для каждого имени.
Комментариев нет:
Отправить комментарий