@maksim-mshp

Решить задачу на Python. В чем проблема?

Бригада скорой помощи выехала по вызову в один из отделенных районов. К сожалению, когда диспетчер получил вызов, он успел записать только адрес дома и номер квартиры K1, а затем связь прервалась. Однако он вспомнил, что по этому же адресу дома некоторое время назад скорая помощь выезжала в квартиру K2, которая расположена в подъезда P2 на этаже N2. Известно, что в доме M этажей и количество квартир на каждой лестничной площадке одинаково. Напишите программу, которая вычисляет номер подъезда P1 и номер этажа N1 квартиры K1.

Входные данные

Во входном файле записаны пять положительных целых чисел K1, M, K2, P2, N2. Все числа не превосходят 1000.

Выходные данные

Выведите два числа P1 и N1. Если входные данные не позволяют однозначно определить P1 или N1, вместо соответствующего числа напечатайте 0. Если входные данные противоречивы, напечатайте два числа –1 (минус один).

Примеры
Ввод
89
20
41
1
11

Вывод
2 3

Ввод
11
1
1
1
1
Вывод
0 1

Вот мой код, который не работает(
K1 = int(input())
M = int(input())
K2 = int(input())
P2 = int(input())
N2 = int(input())
N1 = 0
P1 = 1
n = 0
if P2 * N2 == 1:
    if K1 <= K2:
        print(1, 1)
    elif M == 1:
        print(0, 1)
    elif K2 <= M * K2:
        print(1, 0)
    else:
        print(0, 0)
    quit()
a = max((K2 + (P2 - 1) * M + N2 - 1) // ((P2 - 1) * M + N2), 1)
b = (K2 - 1) // ((P2 - 1) * M + N2 - 1)
if a > b:
    print(-1, -1)
    quit()
d = (K1 - 1) // (M * b) + 1
c = (K1 - 1) // (M * a) + 1
e = (K1 - 1) % (M * a) // a + 1
f = (K1 - 1) % (M * b) // b + 1
print(0 if c != d else c, 0 if e != f else e)
  • Вопрос задан
  • 5691 просмотр
Решения вопроса 1
Не эффективно но выглядит рабочим, единственное вероятнее надо допилить получение количества квартир на этаже. дальше все просто

dann = [
    (89, 20, 41, 1, 11),
    (11, 1, 1, 1, 1)
]


def round_up(v, d):
    result = v // d + (1 if v % d else 0)
    return result


def find(room_1, max_level, room_old, p_old, level_old):
    count_room_for_level = 0
    # Определим количество этажей на этаже
    if max_level == 1 and p_old == 1:
        return 1, 1

    for count_room_for_level in range(40):
        if ((level_old - 1) * count_room_for_level) * p_old < room_old < (count_room_for_level * level_old) * p_old:
            print(count_room_for_level)
            break
    else:
        return -1

    # Определим возможный подъезд
    p_new = round_up(room_1, (max_level * count_room_for_level))
    # Этаж
    level_new = round_up(room_1, count_room_for_level) % max_level
    print(p_new, level_new)
    return p_new, level_new


print(list(find(*v) for v in dann))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
На питоне пока не соображу сразу на go вот так:
package main
import (
	"fmt"
)

func main() {

	M := 5 // Этажность

	K2 := 32 // известн.: кв
	P2 := 2  //           подъезд
	N2 := 3  //           этаж

	Ksearch := 10

	avgK := K2 / (N2 + (M * (P2 - 1)))     // кол кв на этаже
	Psearch := Ksearch / (M * avgK)
	Nsearch := (Ksearch - (M*avgK)*(Psearch)) / avgK

	fmt.Println("кол-кв-на-этаж:", avgK, " подъезд: ", Psearch+1, " этаж: ", Nsearch+1)
}


по такому принципу на питон если переписать, при условии одинаковых этажей

на питоне

M = 5       # Этажность
K2 = 32   # известн.: кв
P2 = 2     #           подъезд
N2 = 3     #           этаж

Ksearch = 89

avgK = K2 // (N2 + (M * (P2 - 1))) # кол кв на этаже
Psearch = Ksearch // (M * avgK)
Nsearch = (Ksearch - (M*avgK)*(Psearch)) // avgK

print("кол-кв-на-этаж:", avgK, " подъезд: ", Psearch+1, " этаж: ", Nsearch+1)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы