![]() |
|
|
![]()
|
|
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
создал тему, похоже не там вот собственно задача и реализация на с++
задача вот моя реализация
проходит 17/18 тестов, есть недоработки... в основном не выходит за пределы 0,012 с, а в 18-ом тесте от 2,04 до 2,08 с Это сообщение отредактировал(а) Dmi3ev - 8.10.2013, 19:11 -------------------- |
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Может быть 18-й тест проходит на больших числах, когда hpall имеет порядок 10^18. И при конвертации в double происходит потеря точности. Попробуй реализоать всё в целочисленной арифметике.
------------------- Сейчас изменил две строки в твоём варианте - заменил ceil на целочисленное деление и инкремент - и для hd=987654321; dd=500; hp=12345678; dp=3; время работы изменилось с 2,6 с на 1,4 с. Это сообщение отредактировал(а) ФедосеевПавел - 9.10.2013, 18:06 |
|||
|
||||
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
как именно изменил? может быть это меняет правильность решения...
-------------------- |
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Я плохо говорить на C++, но таки по смыслу
|
|||
|
||||
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
так не проходит еще один тест((( -------------------- |
|||
|
||||
| Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Я не уверен, но по моему от действительной арифметики легко избавиться считая не число выживших копейщиков, а число убитых
если мы поделим суммарный урон, нанесенный драконом на запас жизни одного копейщика, то целочисленное деление даст точно нужный результат! Я никогда не писал на С но думаю, что правильно исправил программу
-------------------- Mirkes |
|||
|
||||
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
послушал вас всех и оптимизировал:
теперь все тесты летают за 0,003 с, а тот все еще не проходит... есть идеи??? -------------------- |
|||
|
||||
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
Так задача не решается!!! Данная замена неправильная... -------------------- |
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
А может и правильная.
Теперь мне кажется другое. 1) Тип long long целочисленный со знаком - не происходит ли переполнение разрядной сетки с изменением знака. Может попробовать unsigned long. 2) Кроме того, у Mirkes в коде присутствует маленькая ошибка - нет инициализации dpall, что приводит к неверным результатам 3) твой последний вариант не находит решения для hd=987654321; dd=500; hp=12345678; dp=3; - зависает. Предлагаю улучшить вариант Mirkes
|
|||
|
||||
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
все, решил, ура)))
надо три цикла просто а не два... все ок, спасибо за помощь... посмотрел чуть с другой стороны на нее...
неправильная, я же на тестах проверяю... им можно верить... PS теперь даже при самых худших раскладах задача решается за 0,006 с))) победа Это сообщение отредактировал(а) Dmi3ev - 10.10.2013, 21:56 -------------------- |
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Если это возможно, покажи решение или расскажи, что за цикл добавляется.
-------------- Также интересно, тест 18 не проходил по времени или по некорректным результатам? Это сообщение отредактировал(а) ФедосеевПавел - 10.10.2013, 22:10 |
|||
|
||||
| Dmi3ev |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
По времени не проходил, решение изначально верное... после оптимизации стало еще больше похоже... В третий цикл запихнул случай, когда дракон не каждый раз кого-то убивает... т. е. отдельно рассмотрел к=0. Сейчас уже вижу, что можно вывести формулу, но... задача уже решена) ср. время работы 0,002 с.
там ограничение до 10^9 в задаче... проверил кстати, у меня все работает в том варианте... ты что юзаешь??? Добавлено @ 22:31 PascalABC
GNU C++
Это сообщение отредактировал(а) Dmi3ev - 10.10.2013, 22:32 -------------------- |
||||||||
|
|||||||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: нет Всего: 10 |
Про зависание - наверное. я поторопился и где-то ошибся.
Баловался Code::Block+MinGW == gnu c++ Поздравляю с найденым решением! |
|||
|
||||
| Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Вообще-то задачу решал не я
По поводу идей - есть. Скорее всего программа слишком долго ищет решение потому, что оценка нужного числа копейщиков слишком грубая от 1 до hd/dp. Если дракон слабенький но очень живучий (dh большое а dd маленькое) и копейщики тоже живучие но слабые, то число обменов ударами будет большое (много времени на проверку одного предполагаемого числа копейщиков) Учитывая заданный в задаче диапазон чисел вы вполне можете получить оценку типа 10^9: dh=10^9; dp=1; dd=10; hp=10; При этих условиях вы будете гонять порядка 30 рассчетов, причем при большом числе копейщиков каждый рассчет будет весьма долгим. Я посмотрел на правильный ответ потребуется 14142 тура. Представьте время, которое вам для этого потребуется Можно поробовать идти от числа туров при обмене ударами. [] - взятие целой части 1 тур N*dp=hd 2 тура 2N*dp-[dd/hp]*dp=hd 3 тура 3N*dp-[dd/hp]*dp-[2*dd/hp]*dp=hd и т.д. В каждом из этих уравнений нужно вычислить N и [k*dd/hp] Если второе значение станет больше первого, то проскочили и правильным ответом является N с предыдущего шага Если правильно организуете расчеты, то на каждом шаге нужно будет выполнить пару умножений и делений. Все операции только с целочисленными переменными. Полученный ответ может быть на 1 меньше, чем правильный. Это прийдется проверить путем прямого рассчета. Однако в этом случае число прямых рассчетов будет всего 2-3. А первичное вычисление N будет достаточно быстрым, поскольку в нем нет внутренних циклов. Успеха! -------------------- Mirkes |
|||
|
||||
| Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
Mirkes, я уже решил задачу и выложил решение давно, смотри выше ) -------------------- |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |