КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Превышения ограничения по времени
Про имена переменных Begin Var Begin Var Отступы. Пример: это кусок моего решения задачи J с заочки 9-10-го года. Без отступов. http://olympiads.ru/zaoch/2009/problems/j.shtml
i, j, k, ht, l, r, t, q: integer; z: array [0..31] of integer; x:= 0; FillChar(m[1], sizeof(m[1]), 0); for ht:= 1 to H do begin pb[0]:= 0; for i:= 1 to W do pb[i]:= pb[i - 1] + p[ht, i]; FillChar(m[x], sizeof(m[x]), 0); for k:= 1 to N - H + ht do begin for l:= 1 to W do begin z[W + 1]:= 0; for r:= W downto l do begin if k >= r - l + 1 then z[r]:= m[1 - x, k - r + l - 1, l, r] + pb[r] - pb[l - 1] else z[r]:= 0; if z[r] < z[r + 1] then z[r]:= z[r + 1]; if z[r] > m[x, k, r, r] then m[x, k, r, r]:= z[r]; end; end; for l:= 1 to W - 1 do for r:= l + 1 to W do begin t:= m[x, k, l, r - 1]; q:= m[x, k, r, r]; if t > q then m[x, k, l, r]:= t else m[x, k, l, r]:= q; end; end; x:= 1 - x; end; end; Слабо определить сложность этого алгоритма? И вообще, можно ли как-нибудь понять, что тут написано? Какому begin-у соответствует пред-предпоследний end? При каких значениях переменных может произойти присваивание m[x, k, r, r]:= z[r]? Такой код невозможно не только читать, но и отлаживать. В оригинале эта процедура выглядит так. 1. procedure Main; 3. i, j, k, ht, l, r, t, q: integer; 4. z: array [0..31] of integer; 6. x:= 0; 7. FillChar(m[1], sizeof(m[1]), 0); 8. for ht:= 1 to H do begin 9. pb[0]:= 0; 10. for i:= 1 to W do pb[i]:= pb[i - 1] + p[ht, i]; 11. FillChar(m[x], sizeof(m[x]), 0); 12. for k:= 1 to N - H + ht do begin 13. for l:= 1 to W do begin 14. z[W + 1]:= 0; 15. for r:= W downto l do begin 16. if k >= r - l + 1 then z[r]:= m[1 - x, k - r + l - 1, l, r] + pb[r] - pb[l - 1] 17. else z[r]:= 0; 18. if z[r] < z[r + 1] then z[r]:= z[r + 1]; 19. if z[r] > m[x, k, r, r] then m[x, k, r, r]:= z[r]; 20. end; 21. end; 22. for l:= 1 to W - 1 do 23. for r:= l + 1 to W do begin 24. t:= m[x, k, l, r - 1]; 25. q:= m[x, k, r, r]; 26. if t > q then m[x, k, l, r]:= t 27. else m[x, k, l, r]:= q; 28. end; 29. end; 30. x:= 1 - x; 31. end; 32. end;
Тут определить сложность очень просто – она равна O(N*H*W^2), что вполне приемлемо для этой задачи (и, кстати, это решение набрало полный балл). Написать что-то такое, не расставляя отступы, просто невозможно.
Называйте переменные по-нормальному! Используйте хотя бы первые буквы слов, отражающих, по вашему мнению, смысл переменной. Например, сумму цифр числа естественно (хотя и совсем не обязательно) обозначать digsum или DigSum, или просто ds. Координаты лучше обозначать именами x и y. Если нужна еще одна точка, то пусть это будет (x2, y2). Или, например, (xm, ym), если в этой точке достигается какой-нибудь минимум или максимум. НИКОГДА не называйте переменные именем O(o) или I(i). Потому что операции типа x:= O или I:=1 вводят в замешательство, а выражения типа if O = 0 (if I = 1) и вовсе взрывают мозг. Не используйте русские слова в именах процедур, функций, переменных и названии программы. Это тупо. Например, некоторые любят писать что-нибудь вроде function stepen(a, b: integer): integer; По английски «степень» – «power», а не «stepen». Используйте английские слова.
Вы столкнулись с проблемой небольшого превышения ограничения по времени. Например: на вашем компьютере решение проходит худший тест за 1.5 секунды, а ограничение в задаче - 1c. В таких ситуациях естественно попытаться как-нибудь оптимизировать код. Почти в любом запрограммированном алгоритме есть тонкое место - одна или несколько строк, которые повторяются больше всего раз. Эти места могут существенно повлиять на скорость работы алгоритма, даже если весь остальной код сильно неоптимален. Увидеть их легко благодаря тем самым отступам (они обычно сильнее всего смещены вправо). Иногда достаточно просто поменять тип параметра функции с long long на long, что избавляет от некоторых лишних (в этом решении) операций. Оценивайте сложность всех решений, которые пишете. Имейте в виду, что алгоритмы сложности O(N^3) при N ~ 1000 проходят очень редко. Исключение составляет алгоритм Флойда, который довольно часто укладывается в 1-2с. Программировать можно не только решения задач, но и генераторы тестов, алгоритмы для проверки каких-то гипотез, чекеры (например, когда пишешь банальное решение и на маленьких тестах сверяешь его со своим) и т.д. Это все бывает очень полезно.
Дата добавления: 2015-07-02; Просмотров: 128; Нарушение авторских прав?; Мы поможем в написании вашей работы! |