Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566

Нужно ускорить/опитимизировать код

30.04.2023, 08:37. Показов 4013. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:
La Cucaracha Каждую полночь в квартире ученого Васи начинается ужас. Сотни ..., о нет! ТЫСЯ- ЧИ тараканов вылазят из каждой дырки к его обеденному столу, уничтожая все крошки и объедки! Вася ненавидит тараканов. Он очень долго думал и сделал Супер-ловушку, которая привлекает всех тараканов в большой зоне после активации. Он планирует ак- тивировать ловушку сегодня ночью. Но есть проблема. Эта очень эффективная ловушка с её очень большой зоной работы поглощает огромное количество энергии. Так что, Вася планирует минимизировать время работы этой ловушки. Он собрал информацию о всех местах, в которых живут тараканы. Также он заметил, что все тараканы двигаются толь- ко по линиям его скатерти с постоянной скоростью (мы можем предположить, что эта скорость равна 1, так что таракан расположенный в одной из секций, может за 1 едини- цу времени переместится на любую соседнюю секцию (по вертикали или горизонтали)). Вася решил активировать его ловушку в одной из секций. Когда ловушка активирована, все тараканы будут двигаться к секции, содержащей ловушку, так быстро, как только смогут. Поэтому в любой момент времени после активации тараканы двигаются к сек- ции, в которой находится ловушка, максимально уменьшая расстояние до неё. Если есть два пути с одинаковым расстоянием, то таракан выберет любой. Напишите программу для Васи, которая выбирает секцию, минимизирующую время, необходимое для уни- чтожения всех тараканов. Конечно, ваша программа будет считать, что скатерть будет плоскостью с декартовой системой координат и секции — точки с целыми координатами. Формат входного файла В первой строке входного файла содержится число мест, в которых живут тараканы М (1< М < 10000). Следующие М строк содержат 1 и у — координаты мест, в которых живут тараканы (целые числа не больше 10° по абсолютному значению). Формат выходного файла Вам необходимо вывести только два целых числа х и у, не превосходящие по модулю 10°, — координаты секции, которая минимизирует время работы. Если есть более одное решение — выведите любое из них.
Вот мой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def max_distance(trap_x, trap_y, coordinates):
    distance = 0
    for x, y in coordinates:
        distance = max(distance, abs(trap_x - x) + abs(trap_y - y))
    return distance
 
 
def main():
    M = int(input())
    coordinates = [tuple(map(int, input().split())) for _ in range(M)]
 
    x_min, _ = min(coordinates, key=lambda c: (c[0], c[1]))
    x_max, _ = max(coordinates, key=lambda c: (c[0], c[1]))
    _, y_min = min(coordinates, key=lambda c: (c[1], c[0]))
    _, y_max = max(coordinates, key=lambda c: (c[1], c[0]))
 
    min_time = float('inf')
    result_x, result_y = 0, 0
 
    for trap_x in range(x_min, x_max + 1):
        for trap_y in range(y_min, y_max + 1):
            cur_time = max_distance(trap_x, trap_y, coordinates)
            if cur_time < min_time:
                min_time = cur_time
                result_x, result_y = trap_x, trap_y
 
    print(result_x, result_y)
 
 
if __name__ == "__main__":
    main()

Но он не проходит огроменный тест((
Кликните здесь для просмотра всего текста
239
-254 -670
-596 714
608 -680
-96 479
-1 -97
620 440
-112 339
514 -265
65 -386
119 -13
223 -386
-254 -158
159 271
589 -341
560 553
620 295
62 -546
516 352
396 88
-685 -521
217 294
52 -86
205 -608
58 225
-673 -532
-195 -14
-204 -5
-41 11
-65 -689
-289 385
350 -386
-226 284
465 -425
-561 -326
90 644
403 430
-459 399
313 483
-630 -286
-519 -623
-314 698
155 -506
-609 -65
-466 517
347 600
-308 -599
295 -71
443 -153
337 -706
449 -205
62 -203
609 400
-354 -201
-145 -28
-44 -355
-360 -150
625 538
-642 -677
-700 -716
-309 100
-59 -439
-286 -391
-339 525
-273 85
-21 -63
671 506
-193 589
-93 519
-463 524
-694 -96
76 -388
334 470
-322 -616
-69 398
376 694
-121 124
336 -197
-302 437
427 -360
-590 -302
611 252
122 276
-616 258
-629 234
-141 -132
33 -237
556 692
311 530
-401 -642
108 -550
-272 -426
642 271
481 202
306 706
113 471
225 -705
67 712
276 555
-591 279
-263 180
20 441
-160 -138
627 307
133 -202
-241 3
-420 496
-669 -123
-679 -22
-470 643
69 69
385 -311
412 -46
-28 649
-242 38
-373 624
-29 -689
-368 122
138 -91
-633 -600
-689 -53
449 -280
-502 493
285 -253
95 -131
-295 586
-308 441
-120 354
32 353
0 -315
89 399
341 -237
138 638
-55 669
211 441
1 -438
604 249
7 71
-404 -622
-56 133
-369 321
562 500
622 263
-48 439
-476 -358
-693 603
-61 555
-454 405
-35 -246
-463 544
79 -46
-145 166
-20 449
562 38
-367 70
531 480
0 29
424 428
-695 241
360 0
-291 312
-594 -696
-563 -463
102 -550
279 610
61 652
505 646
404 -199
-475 -674
-577 332
-608 -139
521 167
67 314
684 -15
101 474
708 -257
354 -414
-142 588
169 -646
-311 -528
135 -261
502 39
122 -199
99 575
275 436
555 517
110 460
386 -60
-204 -623
69 -203
-498 458
442 -409
173 -541
-292 -495
-561 696
-581 106
-313 602
44 192
-264 -158
99 -495
-660 632
235 453
178 -618
-275 476
247 -520
377 65
478 516
287 115
-305 -469
356 3
313 59
-473 -513
189 673
-490 -694
-541 -287
-25 2
-50 105
-35 287
-554 -4
130 -481
713 -233
-698 561
-435 367
-625 -331
-170 -129
-183 584
139 -210
-623 -13
-315 48
-76 -548
143 624
574 382
-21 -482
-707 461
653 43
-550 482
148 571
481 633
-222 561
-450 126



Что делать? Как быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2023, 08:37
Ответы с готовыми решениями:

Задача: даны НОК и НОД. Нужно найти все пары чисел, для которых они верны. Нужно ускорить код
Коллеги, всем привет. Задача: есть НОК и НОД, нужно найти все пары чисел, для которых они верны. У меня получилось такое решение: ...

Ускорить код:
вот задача: На детском утреннике Дед Мороз выдал каждому из n детей по конфете. Однако дети оказались капризными, и каждый из...

Как ускорить код?
https://inf-ege.sdamgia.ru/problem?id=36000 задача с файлом отсюда написал код : with open ('26-2.txt') as f: ...

55
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.04.2023, 15:29
Студворк — интернет-сервис помощи студентам
Red white socks, координаты нужно повернуть на 45 градусов.

Добавлено через 59 секунд
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
30.04.2023, 17:49
DOPIXKMNLD, почему (1,6) правильный???
Дает общее расстояние == 0+2 + 0+3 + 0+1 = 6
(1,5) == 0+1 + 0+4 + 0+0 = 5, что меньше 6
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
30.04.2023, 17:59
eaa, я слаб в геометрии, а уж вслепую на телефоне мне тут вообще без шансов.
Но если так, то красиво)

Добавлено через 1 минуту
Gdez, надо максимум минимизировать. (1, 6) дает 3, а (1, 5) - 4.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.04.2023, 18:00
Red white socks, ну нам же описанный ромб нужно найти. а если перевернуть, то нужно будет найти квадрат.

Добавлено через 1 минуту
это будет за O(n).
можно бинпоиском найти. но бинпоиском по ответу, а не просто бинпоиск.
1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
30.04.2023, 18:06
eaa, И почему после поворота ромб в квадрат превратится
Но идею понял, непонятно, как это работает. правда, на задворках где-то понимаю, что это развитие идеи с диаметральными точками

Добавлено через 1 минуту
Цитата Сообщение от eaa Посмотреть сообщение
можно бинпоиском найти. но бинпоиском по ответу
Бинпоиском по радиусу в смысле?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.04.2023, 18:21
это же манхэттенские расстояния.
Кликните здесь для просмотра всего текста
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
30.04.2023, 20:07  [ТС]
eaa, Red white socks, Gdez,

Ну так что товарисчи, как это можно сделать?((

Я предлагал алгроитм с поворотом фигуры
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
30.04.2023, 20:21
DOPIXKMNLD, если я правильно понял, то вам нужно найти наименьший квадрат с диагоналями по сетке, в котором содержатся все точки.
Половина его диагонали будет решением.
Сам квадрат ищется тем самым поворотом. Тогда его сторона - разность между максимумом и минимумом по координате после поворота(из двух выбираем максимальное). Навскидку нужно подумать, что делать с иррациональными числами, стоит ли работать в арифметике с sqrt(2), но может эта проблема надуманная
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.04.2023, 20:27
Цитата Сообщение от DOPIXKMNLD Посмотреть сообщение
Я предлагал алгроитм с поворотом фигуры
я не видел, читал только задание и комментарии Red white socks.
Цитата Сообщение от Red white socks Посмотреть сообщение
может эта проблема надуманная
надумана.
2
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
01.05.2023, 08:31  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def distance(x1, y1, x2, y2):
    return abs(x1 - x2) + abs(y1 - y2)
 
def find_best_section(coordinates):
    min_x, max_x = min(coordinates, key=lambda c: c[0])[0], max(coordinates, key=lambda c: c[0])[0]
    min_y, max_y = min(coordinates, key=lambda c: c[1])[1], max(coordinates, key=lambda c: c[1])[1]
 
    min_max_distance = float('inf')
    best_section = None
 
    for x in range(min_x, max_x + 1):
        for y in range(min_y, max_y + 1):
            max_distance = max(distance(x, y, x_c, y_c) for x_c, y_c in coordinates)
            if max_distance < min_max_distance:
                min_max_distance = max_distance
                best_section = (x, y)
 
    return best_section
 
def main():
    M = int(input())
    coordinates = []
    for _ in range(M):
        x, y = map(int, input().split())
        coordinates.append((x, y))
 
    x_best, y_best = find_best_section(coordinates)
    print(x_best, y_best)
 
if __name__ == "__main__":
    main()
Вот код, который проходит 239 координат примерно за 40 секунд
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.05.2023, 09:14
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from math import sqrt
arr_x = []
arr_y = []
for _ in range(int(input())):
    x, y = map(int, input().split())
    arr_x.append(x/sqrt(2) - y/sqrt(2))
    arr_y.append(x/sqrt(2) + y/sqrt(2))
 
 
x = (max(arr_x)+min(arr_x))/2
y = (max(arr_y)+min(arr_y))/2
ans_x = x/sqrt(2) + y/sqrt(2)
ans_y = -x/sqrt(2) + y/sqrt(2)
 
print(ans_x, ans_y)
Добавлено через 14 минут
округляем вверх
1
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
01.05.2023, 09:46  [ТС]
eaa, к сожалению не во всех случаях работает


====== Тест #3 =======
--- Входные данные: размер 15 ---
3
0 0
4 4
-1 5

--- Результат работы: размер 4 ---
0 3

--- Правильный ответ: размер 4 ---
0 4
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.05.2023, 09:48
Да, там нужно смотреть. Где вниз где вверх округлять.
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
01.05.2023, 10:39  [ТС]
Или вот:
1
239 17
239 17.000000000000014

Добавлено через 13 секунд
eaa, хорошо, буду стараться!

Добавлено через 45 минут
Цитата Сообщение от eaa Посмотреть сообщение
Да, там нужно смотреть. Где вниз где вверх округлять.
это не везде прокатывает, на больших тестах у меня такое получилось:
====== Тест #22 =======
--- Входные данные: файл слишком велик, размер 205030 ---
--- Результат работы: размер 15 ---
12724 43825571

--- Правильный ответ: размер 15 ---
12724 43825572

--- Поток ошибок: размер 0 ---

--- Вывод проверяющей программы: размер 59 ---
wrong answer Contestant says 999960730, jury say 999960729

Добавлено через 32 секунды
Цитата Сообщение от eaa Посмотреть сообщение
нам же описанный ромб нужно найти. а если перевернуть, то нужно будет найти квадрат.
Можете поподробнее про это???
В смысле, как это в код запихнуть?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.05.2023, 11:23
DOPIXKMNLD, я и реализовал этот алгоритм.

Добавлено через 3 минуты
DOPIXKMNLD, а ты чем округляешь? round?
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
01.05.2023, 11:35  [ТС]
eaa,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from math import sqrt
 
 
arr_x = []
arr_y = []
for _ in range(int(input())):
    x, y = map(int, input().split())
    arr_x.append(x / sqrt(2) - y / sqrt(2))
    arr_y.append(x / sqrt(2) + y / sqrt(2))
 
x = (max(arr_x) + min(arr_x)) / 2
y = (max(arr_y) + min(arr_y)) / 2
ans_x =\
    round(x / sqrt(2) + y / sqrt(2) - 1 * 10 ** -10*121)
ans_y =\
    round(-x / sqrt(2) + y / sqrt(2) + 1 * 10 ** -5)
 
print(ans_x, ans_y)
Добавлено через 2 минуты
eaa, 22 тест уже прошел, теперь вот это

Не по теме:

****




====== Тест #49 =======
--- Входные данные: файл слишком велик, размер 207813 ---
--- Результат работы: размер 17 ---
-1445565 5154739

--- Правильный ответ: размер 17 ---
-1445566 5154739

Добавлено через 3 минуты
Проблема в том, похоже, что в 49 тесте ans_y = -1445565,5

Значит, по моему коду(доделанному из вашего) прога его округляет вниз, а надо вверх
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.05.2023, 11:37
DOPIXKMNLD, я "сто" лет назад решал эту задачу. правда не на питоне. проблем вроде не было.

Добавлено через 1 минуту
DOPIXKMNLD, все правильно округляет. когда отрицательные тебе eps нужно прибавлять, а не вычитать.
1
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
01.05.2023, 11:42  [ТС]
eaa, пробую!
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.05.2023, 11:42
можно abs от числа округлять, а потом умножать на знак.
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
01.05.2023, 11:47  [ТС]
eaa, неа, не получилось
Ошибка на этом же тесте
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from math import sqrt
 
arr_x = []
arr_y = []
for _ in range(int(input())):
    x, y = map(int, input().split())
    arr_x.append(x / sqrt(2) - y / sqrt(2))
    arr_y.append(x / sqrt(2) + y / sqrt(2))
 
x = (max(arr_x) + min(arr_x)) / 2
y = (max(arr_y) + min(arr_y)) / 2
ans_x = \
    round(x / sqrt(2) + y / sqrt(2) - 1 * 10 ** -10 * 121)
if ans_x < 0:
    ans_x = round(1 * 10 ** -10 * 121 + ans_x)
ans_y = \
    round(-x / sqrt(2) + y / sqrt(2) + 1 * 10 ** -5)
 
print(ans_x, ans_y)
Добавлено через 3 минуты
Цитата Сообщение от eaa Посмотреть сообщение
можно abs от числа округлять, а потом умножать на знак.
а как?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.05.2023, 11:47

Как ускорить код?
Здравствуйте! Скажите, пожалуйста, как можно ускорить данный код? Не проходит проверку def checkPrime(start, end): numbersList...

Как ускорить код
Добрый день! Написал такой код, который очень медленно работает при строке в 20000 чисел, разделенных пробелом. Я не представляю...

Как ускорить код? Оптимизировать?
Задача: Определите количество целочисленных точек, находящихся внутри и на границе круга радиуса r с центром в начале координат. ...

Нужно ускорить код
Условие Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть копеек отбрасывается....

Код работает долго, нужно ускорить
Программа считает, сколько в среднем времени занимает процедура. На 1 000 итераций и массиве в 1 000 000 элементов работает слишком долго....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru