Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2020, 12:40   #121
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Спасибо)

Ешё одно задание:
1)Исходные данные
В единственной строке находится целое число N, 1 ≤ N ≤ 109.
Результат
Следует вывести два целых положительных числа A и P, таких, что
N = A + (A + 1) + … + (A + P − 1).
Среди всех пар чисел A и P, удовлетворяющих условию 1, у выводимой пары максимально значение P.
Мой вариант:
Код:
def operation():
    global n, done, p, a, sum
    b = a
    while sum < n:
        sum += b
        b += 1
    if sum == n:
        p = b + a - 2
        done = True
    else:
        a += 1
        sum = 0
    print(a, b, p, sum)


n = int(input())
done = False
sum = 0
p = None
a = -1
while not done:
    operation()
print(a, p)
Есть идеи?
FsGaCh вне форума Ответить с цитированием
Старый 27.10.2020, 17:30   #122
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
n = int(input())
a = 1
sum = a
b = a
while True:
    while sum < n:
        b += 1
        sum += b
    if sum == n:
        p = b - a + 1
        print(a, p)
        break
    else:
        sum -= a
        a += 1
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 27.10.2020 в 17:46.
BDA вне форума Ответить с цитированием
Старый 28.10.2020, 18:22   #123
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

1)Поп-группа «Розовый слон» приступила к записи своего дебютного альбома. Правда, у группы пока всего две песни: «Моя любовь» и «Я скучаю по тебе», но зато на каждую сделано огромное количество ремиксов.
Продюсер группы сказал, что в альбом должно войти ровно n треков, каждый из которых — это ремикс на одну из двух песен группы. Поразмыслив, музыканты решили, что диск будет интересно слушать только в том случае, если на нём не более a треков подряд будут ремиксами на песню «Моя любовь» и не более b треков подряд будут ремиксами на песню «Я скучаю по тебе». Иначе есть риск, что даже самые преданные фанаты не дослушают альбом до конца.
Сколько существует различных вариантов записи альбома из n композиций, который будет интересно слушать? Вариант записи — это последовательность чисел 1 и 2, где единицы обозначают ремиксы на песню «Моя любовь», а двойки — ремиксы на песню «Я скучаю по тебе». Два варианта считаются различными, если для некоторого i в одном варианте на i-м месте стоит единица, а в другом — двойка.

Мой вариант:
Код:
def decrypt(number):
    number.replace('1', '0')
    number.replace('2', '1')
    return number
def uncrypt(number):
    number.replace('1', '2')
    number.replace('0', '1')
    return number
def ToBin(number):
    return int(bin(number)[2:])
def BinToTen(number):
    returning = 0
    for i in range(len(number)):
        returning += int(number[i]) * 2 ** i
    return returning
def increase(number):
    global done, maxNum
    string = decrypt(number)
    tenthNumber = BinToTen(string) + 1
    returning = uncrypt(str(ToBin(tenthNumber)))
    if returning == maxNum:
        done = True
    print(done, returning)
    return returning
n, a, b = map(int, input().split())
amount = 0
done = False
startingNum = '2' * (n - 1)
maxNum = '2' * n
print(startingNum)
while done != True:
    startingNum = increase(startingNum)
    print(startingNum)
    if done == True:
        break
    if '1' * a not in startingNum and '2' * b not in startingNum:
        amount += 1
    print(amount, '+ 1')
print(amount)
Из-за какой-то ошибки (с большей вероятности, она находится в функциях), которую я не нашёл, цикл while не заканчивается. Если возможно, измените мой вариант так, что бы он работал, а не начинайте с нуля.
FsGaCh вне форума Ответить с цитированием
Старый 28.10.2020, 20:58   #124
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Честно говоря, мне лень отлаживать ваш код. Такое количество преобразований неоправданно. По идее, можно решить с помощью комбинаторики, но вот простейший перебор:
Код:
n, a, b = map(int, input().split())
sa = '0' * a
sb = '1' * b
amount = 0
for i in range(2 ** n):
    s = "{:0{}b}".format(i, n)
    if sa not in s and sb not in s:
        amount += 1
print(amount)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.01.2021, 14:23   #125
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Есть 5 задач которые мне интересны, но у меня есть свой вариант только к двум из них.

1)Вдоль моря узкой полосой тянется пляж. В некоторых точках пляжа расположены ларьки с мороженым. В один прекрасный день не все мороженщики вышли на работу. Распределите мороженщиков по ларькам так, чтобы минимальное расстояние между мороженщиками было как можно больше. Так они меньше будут мешать друг другу.

Входные данные
В первой строке вводятся количество ларьков n (2 < n < 10001) и количество мороженщиков k (1 < k < n), вышедших на работу. Во второй строке заданы n натуральных чисел в порядке возрастания - координаты ларьков (координаты не превосходят 109).

Выходные данные
Выведите минимальное расстояние между соседними ларьками в оптимальной расстановке.

У меня есть свой вариант, но он не работает:
Код:
import math
def sortDict(dicti):
    listi =[list(dicti.items())]
    dictKeys = dicti.keys()
    dictValues = [dicti[i] for i in dictKeys]
    return dict.fromkeys(dictKeys, dictValues)
n, k = map(int, input().split())
coords = list(map(int, input().split()))
distances = []
routes = []
for i in coords:
    for h in coords:
        if i != h and i < h:
            distances.append(str(int(math.fabs(i - h))))
            routes.append(str(i) + ' ' + str(h))
print(distances)
print(routes)
print(k)
distances_Routes1 = {int(distances[a]): routes[a] for a in range(len(routes))}
distances_Routes = sortDict(distances_Routes1)
#distances_Routes = {distances_Routes1[i]: distances_Routes1[distances_Routes1[i]] for i in range(len(distances_Routes1))}
print(distances_Routes1)
print(distances_Routes)
if k == 2:
    print(coords[-1] - coords[0])
2)Когда Петя учился в школе, он часто участвовал в олимпиадах по информатике, математике и физике. Так как он был достаточно способным мальчиком и усердно учился, то на многих из этих олимпиад он получал дипломы. К окончанию школы у него накопилось n дипломов, причём, как оказалось, все они имели одинаковые размеры: w - в ширину и h - в высоту.

Сейчас Петя учится в одном из лучших университетов и живёт в общежитии со своими одногруппниками. Он решил украсить свою комнату, повесив на одну из стен свои дипломы за школьные олимпиады. Так как к бетонной стене прикрепить дипломы дсотаточно трудно, он решил купить специальную доску из пробкового дерева, чтобы прикрепить её к стене, а к ней - дипломы. Для того, чтобы эта конструкция выглядела более красиво, Петя хочет, чтобы была квадратной и занимала как можно меньше места на стене. Каждый диплом должен быть размещён строго в прямоугольнике w на h. дипломы запрещается поворачивать на 90 градусов. Прямоугольники, соответствующие различным дипломам, не должны иметь общих внутренних точек.

Требуется написать программу, которая вычислит минимальный размер стороны доски, которая потребуется Пете для размещения всех своих дипломов.

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

Входной файл содержит три целых числа w, h, n (1≤w, h, n ≤ 109).

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

В выходной файл вывести ответ на поставленную задачу.

3)Имеются две строки. На верхней строке отмечено a точек, а на нижней b точек. Соединим отрезком каждую точку верхней строки с каждой точкой нижней строки. Точки расположены так, что количество точек, полученных в результате пересечения отрезков, максимально. Для достижения этой цели достаточно чтобы никакие три отрезка не пересекались в одной точке. Точки на верхней и нижней строках в подсчет не включаются, в них могут пересекаться любое количество отрезков. По значениям a и b Вам необходимо вычислить P(a, b) - максимальное количество точек пересечения, расположенное между двумя строками. Например, пусть a = 2 и b = 3. Из рисунка видно, что P(2, 3) = 3.

Входные данные
Каждая строка содержит два натуральных числа a (0 < a ≤ 20000) и b (0 < b ≤ 20000). Последний тест содержит два нуля и не обрабатывается. Входные данные содержат не более 1200 тестов.

Выходные данные
Для каждого теста в отдельной строке вывести его номер и значение P(a, b). Результат помещается в 64-битовое знаковое целое.

4)Минимум в очереди
На вход программы подается набор операций с очередью. Каждая операция состоит в добавлении или удаления элемента из очереди. После выполнения каждой операции найдите наименьшее число, которое находится в очереди. Сложите все полученные числа и получите ответ. Если после некоторой операции очередь оказалась пуста, то ничего не прибавляйте к ответу. Если выполнить удаление невозможно, так как очередь пуста, то не выполняйте его.

Входные данные
Входные данные генерируются в самой программе. На вход подаются параметры для генерации входной последовательности.

Первое число n (1 ≤ n ≤ 106) содержит количество операций с очередью. Затем идут четыре неотрицательных числа a, b, c, x0, не превосходящие 10000.

Для получения входных данных сгенерируем последовательность x.

Первое число в генерируемой последовательности x1. Первое, а также каждое следующее число вычисляется из предыдущего по формуле:

xi = (a * xi-1 * xi-1 + b * xi-1 + c) / 100 mod 106,

где "/" - операция целочисленного деления, а "mod" - остаток от деления.

Если xi mod 5 < 2, то необходимо удалить число из очереди. В противном случае нужно добавить в очередь число xi.

Выходные данные
Выведите искомую сумму.

5)Милхаузу необходимо на завтра решить задачу, и ему нужна Ваша помощь. Вот задача:

Задана строка, состоящая из скобок. Необходимо превратить ее в правильную строку, вставляя как можно меньшее количество скобок в любую позицию (удалять или изменять существующие скобки нельзя). Правильной является строка, которая удовлетворяет следующим правилам:

Пустая строка правильная.
Если s правильная, то (s) также правильная.
Если s и t правильные, то их конкатенация st правильная.
Например, "(()())", "" и "(())()" правильные строки, а "())(", "()(" и ")" - нет.

Входные данные
Задана строка из скобок, которая содержит от 1 до 50 символов включительно.

Выходные данные
Вывести наименьшее количество скобок, которое следует вставить для того чтобы входная строка стала правильной.

Мой вариант, проходит 13 из 20 тестов:
Код:
n = input()
skobka9 = n.count('(')
skobka0 = n.count(')')
print(int(math.fabs(skobka0-skobka9)))
FsGaCh вне форума Ответить с цитированием
Старый 14.01.2021, 19:11   #126
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

3я задача: если немного порисовать и посчитать количество пересечений, то получится, что P(a, b) = a * b * (a - 1) * (b - 1) // 4.
4я задача: вроде никаких подводных камней - просто перевести текст условия задачи в код, то есть организовать очередь и честно проделать все операции над ней.
5я задача: важно не только количество, но и порядок скобок.
Код:
s = input()
nesting = 0
added = 0
for i in s:
    if i == ')':
        if nesting == 0:
            added += 1
        else:
            nesting -= 1
    else:
        nesting += 1
added += nesting
print(added)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.01.2021 в 19:26.
BDA вне форума Ответить с цитированием
Старый 17.01.2021, 14:34   #127
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Ешё одно задание, мой вариант проходит 9% всех тестов.

1)Вы можете вспомнить хоть одного своего знакомого до двадцатилетнего возраста, который в детстве не играл в компьютерные игры? Если да, то может быть вы и сами не знакомы с этим развлечением? Впрочем, трудностей при решении этой задачи это создать не должно.

Во многих старых играх с двумерной графикой можно столкнуться с подобной ситуацией. Какой-нибудь Герой прыгает по платформам (или островкам), которые висят в воздухе. Он должен перебраться от одного края экрана до другого. При этом при прыжке с одной платформы на соседнюю, у Героя уходит |y2-y1| единиц Энергии, где y1 и y2 – высоты, на которых расположены эти платформы. Кроме того, у Героя есть Суперприем, который позволяет перескочить через платформу, но на это затрачивается 3*|y3-y1| единиц Энергии. Конечно же, Энергию следует расходовать максимально экономно.

Предположим, что вам известны координаты всех платформ в порядке от левого края до правого. Сможете ли вы найти, какое минимальное количество Энергии потребуется Герою, чтобы добраться с первой платформы до последней?

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

В первой строке входного файла записано количество платформ n (1 ≤ n ≤ 30000). Вторая строка содержит n натуральных чисел, не превосходящих 30000 – высоты, на которых располагаются платформы.

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

В выходной файл запишите единственное число – минимальное количество Энергии, которую должен потратить игрок на преодоление платформ (конечно же в предположении, что cheat-коды использовать нельзя).

Мой вариант:
Код:
import math
n = int(input())
y = list(map(int, input().split()))
energyUsed = 0
pos = 0
while True:
    if pos == n - 1:
        break
    else:
        normal = -1
        super = -1
        normal = math.fabs(y[pos]-y[pos+1])
        if pos < n - 2:
            super = math.fabs(y[pos+2]-y[pos])
        if super != -1:
            if super < normal:
                energyUsed += super
                pos += 2
            else:
                energyUsed += normal
                pos += 1
        else:
            energyUsed += normal
            pos += 1
print(int(energyUsed))
FsGaCh вне форума Ответить с цитированием
Старый 17.01.2021, 15:52   #128
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Ну это классическая задача на динамическое программирование.
Код:
n = int(input())
y = list(map(int, input().split()))
if n == 1:
    print(0)
else:
    energyUsed = [0, abs(y[0] - y[1])]
    ys = y[:2]
    for yi in y[2:]:
        step = min(energyUsed[0] + 3 * abs(ys[0] - yi), energyUsed[1] + abs(ys[1] - yi))
        energyUsed.pop(0)
        ys.pop(0)
        energyUsed.append(step)
        ys.append(yi)
    print(energyUsed[1])
Нужно смотреть, не чтобы каждый прыжок был минимально затратным, а чтобы при нахождении на i-ой платформе было затрачено минимальное количество энергии. А на i-ю платформу можно попасть двумя способами: с (i-1)-й платформы и с (i-2)-й платформы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.01.2021, 09:26   #129
Konoha
Новичок
Джуниор
 
Регистрация: 25.01.2021
Сообщений: 3
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну почему же, участвовали конечно же. Просто задачки не особо интересные, да и свои попытки вы не ко всем выкладываете.
Например, последняя задачка. Наивный подход (в лоб перебором):
Код:
k = int(input())
print(reduce(lambda a, b : a + b, (reduce(lambda a, b : a * b, map(int, list(str(i)))) for i in xrange(10 ** (k - 1), 10 ** k))))
Но для k = 7 он рассчитывается за 34 секунды, что точно не пройдет по времени.
Если немного подумать, то можно заметить закономерность между предыдущим и следующим расчетом k. А затем, упростив:
Код:
k = int(input())
print(45 ** k)

Damnn!!! Nicely executed man.
Konoha вне форума Ответить с цитированием
Старый 28.01.2021, 19:48   #130
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

5 задачек которые попытался сделать. Некоторые смог сделать, остальные нет. Те которые я зделал можете улучшить/упростить?
1)В час пик на остановку одновременно подъехали три маршрутных такси, следующие по одному маршруту, в которые тут же набились пассажиры. Водители обнаружили, что количество людей в разных маршрутках разное, и решили пересадить часть пассажиров так, чтобы в каждой маршрутке было поровну пассажиров. Требуется определить, какое наименьшее количество пассажиров придется при этом пересадить.



Входные данные.
Входными данными являются три натуральных числа, не превосходящих 100 - количества пассажиров в первой, второй и третьей маршрутках соответственно.

Выходные данные.
Выведите одно число — наименьшее количество пассажиров, которое требуется пересадить. Если это невозможно, выведите слово IMPOSSIBLE (заглавными буквами).

Пример входных Данных:
1 2 3

Пример выходных данных:
1

Мой вариант:
Код:
def p(a):
    print(a) #Буду пользовать эту функцию для дальнейших задачек
a, b, c = map(int, input().split())
if (a + b + c) % 3 != 0:
    p('IMPOSSIBLE')
else:
    steps = 0
    list = sorted([a, b, c])
    goal = (a + b + c) / 3
    for i in range(3):
        if list[i] < goal:
            while list[i] < goal:
                if i != 2:
                    list[i] = list[i] + 1
                    list[2] = list[2] - 1
                else:
                    list[2] = list[2] + 1
                    list[1] = list[1] - 1
                steps += 1
    p(steps)
2)Проект «Средний вес школьника школы» решили выполнить Мамед с Самедом. Что они будут делать с этим числом, они не раскрывают. Они попросили взвеситься всех учеников школы и занесли результаты в таблицу. Помогите им подсчитать средний вес учеников. Но они просят, чтобы учеников с самым большим и с самым маленьким весом не учитывать. Единственное их упущение, они не подсчитали общее количество учеников, но это, конечно, не помешает вам подсчитать то, что они просят.

Входные данные.
В нескольких строках заданы веса учеников в килограммах, разделенных пробелами (одним или несколькими) или символом конца строки. Читать веса учеников до конца ввода.

Выходные данные.
Средний вес учеников школы без учета учеников с самым большим и самым маленьким весом. Ответ выводить с точностью до килограмм.

Примеры входный данных:
40 23 27
59 68 23 84 27
53 46

Пример выходных данных:
46

Мой вариант (Сделал так что бы код переходил к выполнению после ввода -1):
Код:
def roundHere(numfloat):
    numfloat = str(numfloat)
    h = numfloat.split('.')
    if int(h[1][0]) > 4:
        return int(h[0]) + 1
    else:
        return int(h[0])
n = [0]
weights = []
while -1 not in n:
    n = list(map(int, input().split()))
    weights.extend(n)
del weights[-1]
weights.sort()
minimum = weights[0]
maximum = weights[-1]
while minimum in weights:
    del weights[0]
while maximum in weights:
    del weights[-1]
m = sum(weights) / len(weights)
p(roundHere(m))
3)Движение робота управляется программой. Программа состоит из следующих команд:

S - сделать шаг вперед
L - повернуться на 90. влево
R - повернуться на 90. вправо

Напишите программу, которая по заданной программе для робота определит, сколько шагов он сделает прежде, чем впервые вернется на то место, на котором уже побывал до этого, либо установит, что этого не произойдет.

Входные данные. Одна строка из заглавных латинских букв S, L, R, описывающая программу для робота. Общее число команд в программе не превышает 200, при этом команд S - не более 50.

Выходные данные. Одно число, количество шагов, которое будет сделано (то есть выполнено команд S) прежде, чем робот впервые окажется в том месте, через которое он уже проходил. Если такого не произойдет, выведите число -1.

Пример входных данных:
SSLSLSLSSRSRS

Пример выходных данных:
5

4)Стрелку нужно поразить N мишеней, но у него остался всего один патрон. Требуется определить, может ли он найти такую точку (не обязательно с целыми координатами) и направление выстрела, что пуля, выпущенная из этой точки в этом направлении, пролетит через все мишени.

Входные данные. В первой строке входных данных находится целое число N – количество мишеней ( 1<=N <= 100).. В следующих N строках записаны по 4 целых числа xi1,yi1,xi2,yi2 – начало и конец i-й мишени (мишени представлены как непересекающиеся отрезки на плоскости),
-10000<= xi1,yi1,xi2,yi2 <=10000

Выходные данные. Одна строка, в которой написано слово YES, если решение есть, и NO – если нет.

Пример входных данных
3
2 0 2 4
4 1 6 5
6 3 9 0

Пример выходных данных
YES
FsGaCh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
готовлюсь к олимпиаде по информатике salauat Паскаль, Turbo Pascal, PascalABC.NET 25 01.12.2013 21:32
Подготовиться к олимпиаде за лето UaKot Свободное общение 20 10.05.2013 18:53
Подготовка к региональной олимпиаде New man Помощь студентам 20 14.12.2012 21:01
Задачи по олимпиаде Darick Помощь студентам 7 23.12.2011 15:45
Как подготовиться к олимпиаде? Kn793 Помощь студентам 16 26.07.2008 12:22