@PotaP1

Задание из егэ по информатике.Что не так в моём коде?

15 задание из егэ по информатике.
62a5f23e48dfb507383850.png

Мой код:
def f(x, y, a):
    return ((2 * x + 3 * y) > 30) or ((x + y) <= a)

for a in range(1, 200):
    fl = True
    for x in range(1, 200):
        for y in range(1, 200):
            if not f(x, y, a):
                fl = False
                break
        if fl == False:
            break
    if fl:
        print(a)
        break


В результате работы моей программы выдаёт 14 , а в ответе к заданию 15( задание с сайта решу егэ)
  • Вопрос задан
  • 1266 просмотров
Решения вопроса 2
@twistfire92
Python backend developer
Может мои размышления не самые верные, может "правильный" способ решения вообще другой, но:
У тебя есть выражение, которое истинно тогда, когда верна хотя бы одна из двух частей.
смотрим на левую часть. 2x+3y>30. У нас есть возможные комбинации x и y при которых это выражение будет ложным. Нам эти комбинации и нужны. Главная задача найти из этих двух комбинаций такие "граничные" комбинации, при которых любое увеличение x или y сделает выражение 2x+3y>30 истинным. Для этого пройдемся по x в диапазоне от 0 до 15 и по y в диапазоне от 0 до 10 и подставим в выражение 2x+3y<=30 И среди всех этих комбинаций нужно найти такую, которая даст максимальную сумму.

a = 0
for x in range(16): # от 0 до 15
	for y in range(11): # от 0 до 10
		if 2*(x)+3*(y)<=30:
			if a<x+y:
				a = x+y
print(a)
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
Неотрицательные - это больше или равно 0. У тебя же x и y начинаются с 1. Например, при a=14 можно взять x=15, y=0, первое условие будет ложно, второе тоже, но оба числа целые неотрицательны - условие задачи выполнено.

Ну и решение наивным перебором тоже никуда не годится. А вдруг условие перестанет выполняться, если они будут больше 200? Это тоже надо обосновать. Например, нетрудно видеть, что при x и y больше 6 вырашение 2x+3y будет точно больше 30 (=2*6+3*6), так что можно перебирать только числа от 0 до 6 (конечно же, в виде range(0,7), так как генератор range не включает последнее значение).

Но вообще по-моему этот вопрос скорее всего не на программирование, а на понимание логических операций. И решать его правильно алгебраически или геометрически, как "должно выполняться или то, или другое". И тогда можно не останавливаться на целых значениях x и y, а позволять любые неотрицательные. Ответ, кстати, будет тот же самый: a=15.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для решения такой задачи нужен предварительный анализ.
Поскольку две части соединены логическим ИЛИ, то пока первое неравенство выполняется, истинность второго не имеет значения.
Значит нам надо рассмотреть только ситуацию, когда первое неравенство ложно. Второе, при этом, должно быть истинно.
Инвертируем первое условие, получим 2x + 3y ≤ 30.
Чтобы найти минимальное значение A, при котором выполняется x + y ≤ A, мы должны найти максимум x + y, при котором 2x + 3y ≤ 30.
Задача формализуется в
max(x + y), 2x + 3y ≤ 30, x ∈ N, y ∈ N.
Дальше, опять таки, можно рассуждать аналитически. Поскольку при увеличении x величина 2x + 3y растёт медленнее, чем при увеличении y, то максимальное значение x + y будет достигаться при максимальном значении x и минимальном значении y, удовлетворяющих неравенству. Поскольку минимальное значение y = 0, то получаем неравенство 2x ≤ 30, отсюда x = 15, x + y = 15, A = 15.
А можно написать программу для перебора:
a = 0;
for (x = 0; 2 * x <= 30; x += 1) {
  for (y = 0; 2 * x + 3 * y <= 30; y += 1) {
    if (a < x + y) { 
      a = x + y;
    }
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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