Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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


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

Спасибо)

Ешё одно задание:
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
Сообщений: 5,776
По умолчанию

Код:
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
Сообщений: 66
По умолчанию

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
Сообщений: 5,776
По умолчанию

Честно говоря, мне лень отлаживать ваш код. Такое количество преобразований неоправданно. По идее, можно решить с помощью комбинаторики, но вот простейший перебор:
Код:
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
Сообщений: 66
По умолчанию

Есть 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
Сообщений: 5,776
По умолчанию

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
Сообщений: 66
По умолчанию

Ешё одно задание, мой вариант проходит 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
Сообщений: 5,776
По умолчанию

Ну это классическая задача на динамическое программирование.
Код:
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 на форуме Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS