Когда алгоритм верный, а всё равно TL
Многие удивляются, а как это разные людишки решают задачи так, что они принимаются моментально или почти моментально? Ответ прост: они ставят много интересных экспериментов, оптимизируют код, и порой приходят к забавным результатам. Тут я приведу несколько своих.
Наиболее интересно резкое отличие между вторым и третьим пунктом. Также интересны третий и четвёртый: ведь в последнем идёт многократное обращение к элементу массива, что по идее требует больше времени, чем один раз вызвать функцию.
Чтение целых чисел
1. Accepted in 0.193std::ios_base::sync_with_stdio(0);
//...
std::cin >> a[i];2. Accepted in 0.187scanf("%d", &a[i]);3. Accepted in 0.109int nextInt() {
int res = 0,c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
return res;
}
//...
a[i] = nextInt();4. Accepted in 0.098a[i] = 0;
c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {
a[i] = a[i] * 10 + c - '0';
c = getchar();
}Наиболее интересно резкое отличие между вторым и третьим пунктом. Также интересны третий и четвёртый: ведь в последнем идёт многократное обращение к элементу массива, что по идее требует больше времени, чем один раз вызвать функцию.
Обращение к массиву
1. Time Limit Exceeded (test 9)for(int i = 0; i < n; i ++) {
//Много операций с array[i]
}2. Acceptedfor(int i = 0; i < n; i ++) {
double x = array[i];
//Много операций с x
}Возможно, эти наблюдения смогут кому-то помочь. Мне, скажем, помогали :)



комментарии (62)