Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

“Проходной балл” Как ускорить работу кода и устранить недоработку?

#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



Сразу же можно заметить, что не нужно в принципе выделять память для хранения структур. Получите сначала проходной балл, а потом в цикле проверяйте для каждого имени.

Комментариев нет:

Отправить комментарий