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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2020, 19:47   #41
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Нет, не когда сам элемент не превышает N, а когда сумма всех предыдущих элементов не превышает N.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.05.2020, 20:01   #42
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Нет, не когда сам элемент не превышает N, а когда сумма всех предыдущих элементов не превышает N.
Простите, но я так и не смог это сделать(. Лишь поменял местами 2 строки:
Код:
n = int(input())
a = 1
b = 1
c = 2
count = 0
while c <= n:
    a = b
    b = c
    c = a + b
    count += 1
print(count)
FsGaCh вне форума Ответить с цитированием
Старый 27.05.2020, 21:48   #43
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
n = int(input())
a = 1
b = 1
count = 0
while a <= n:
    n -= a
    c = a + b
    a = b
    b = c
    count += 1
print(count)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.05.2020, 14:07   #44
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
n = int(input())
a = 1
b = 1
count = 0
while a <= n:
    n -= a
    c = a + b
    a = b
    b = c
    count += 1
print(count)
Спасибо, ввёл, всё получилось! И ешё я добавил пару строк для вычисления длины этих самых отрезков. Но мне кажется, что алгоритм фибоначчи не слишком-то подходит. Например, если я ввожу 10, тогда мне показывают длину всех отрезков (1, 1, 2, 3). А их сумма меньше 10, как- будто отрезок с длиной 3 был "выброшен". Ответ подходит для отрезка у которого изначально длина была 7, но не для 10.

Мой код:
Код:
n = int(input())
a = 1
b = 1
count = 0
lens = []
lens.append(a)
while a <= n:
    n -= a
    c = a + b
    a = b
    b = c
    lens.append(a)
    count += 1
print(count)
lens.pop()
print(lens)
FsGaCh вне форума Ответить с цитированием
Старый 28.05.2020, 14:43   #45
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Задание, которое я смог выполнить, но хотел бы узнать как упростить:

Бесконечная в обе стороны полоса ширины 1 разбита на клетки размера 1x1. В одной из них находится робот, который может двигаться из одной клетки в другую. Его перемещения определяются программой, каждая команда в которой – это одна из трех больших латинских букв: L, R, S. Выполняя команду L, робот перемещается на одну клетку влево, команду R – на одну клетку вправо, а S – остается в той же самой клетке. Выполнение программы означает последовательное выполнение всех команд, записанных в ней.
Напишите программу, которая определит сколько различных клеток посетит робот.

Входные данные:
Программа для робота – строка из символов L, R, S. Программа состоит не более чем из 10000 команд.

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

Мой вариант:
Код:
currentplace = 0
cmds = input()
if len(cmds) <= 10000:
    ivebeen = '0'
    for i in cmds:
        if i == 'R':
            currentplace += 1
            ivebeen = ivebeen + ' ' + str(currentplace)
        elif i == 'L':
            currentplace -= 1
            ivebeen = ivebeen + ' ' + str(currentplace)
    ivebeen = ivebeen.split()
    ivebeen = tuple(ivebeen)
    print(len(list(set(ivebeen))))

Последний раз редактировалось FsGaCh; 28.05.2020 в 14:49.
FsGaCh вне форума Ответить с цитированием
Старый 28.05.2020, 15:36   #46
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

В начале игры имеем N камешков. Играют двое. За один ход нужно разделить кучку на две неравные и забрать себе меньшую. Проиграл тот, кто не смог этого сделать.
Сколько камешков взяли бы Вы, если рассчитываете на победу и ходите первым?

Входные данные:
Число камушков в кучке N (1 ≤ N ≤ 10000).

Выходные данные:
Количество взятых Вами камушков, либо 0, если выигрывающего хода нет.

___________________________________ ___________________________________ ___________________________________ _____

Я не смог сделать это задание, я думаю что проблема в неопределённости. Числа растут, и выиграть со 100% вероятностью становится меньше, из-за того что противник может другое число. Например, если общее число равно 100, тогда я беру 14. А вот противник может взять любое число от 1 до 42. Из-за этого вероятность победы сильно зависит от противника.

Я просто сделал саму игру:
Код:
n = int(input('Введите количество камней: '))
while True:
    take = int(input('Сколько хотите взять? '))
    if take < n  / 2:
        n -= take
        print('Осталось', n, 'камней.')
        if n == 2:
            print('Игрок 1 победил!')
            break
        take = int(input('Сколько хотите взять? '))
        if take < n / 2:
            n -= take
            print('Осталось', n, 'камней.')
            if n == 2:
                print('Игрок 2 победил!')
                break

Последний раз редактировалось FsGaCh; 28.05.2020 в 15:49.
FsGaCh вне форума Ответить с цитированием
Старый 28.05.2020, 16:05   #47
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Алпай и Барыш готовились к аттестации по теме "Умножение". Алпай задумывал произведение всех натуральных чисел от A до B, а Барыш старался угадать начальное и конечное числа. Помогите Барышу найти значения A и B. Если решений несколько, выведите то, у которого A наименьшее.

Входные данные:
Одно число – произведение всех натуральных чисел от A до B (1 < A ≤ B ≤ 10000).

Выходные данные:
В одной строке через пробел два числа: A и B.

Это задание я не смог сделать, сделал лишь программу для вычисления всех делителей.
FsGaCh вне форума Ответить с цитированием
Старый 28.05.2020, 16:20   #48
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Про отрезки. Предполагается, что остаток, от которого уже нельзя отрезать следующий элемент Фибоначчи, присоединяется к последнему отрезку. То есть для длины 10 отрезки будут (1, 1, 2, 6). Но в задаче спрашивают именно о количестве отрезков, а не их длинах.

Про бесконечную полосу. Во-первых, не нужно проверять длину входных данных, так как условие как раз гарантирует это. Во-вторых, не нужно делать лишнюю работу со строками.
Код:
s = input()
currentplace = 0
res = set([0])
for i in s:
    if i == 'R':
        currentplace += 1
        res.add(currentplace)
    elif i == 'L':
        currentplace -= 1
        res.add(currentplace)
print(len(res))
Про камешки. Вот и нужно просчитать все варианты хода противника, если они все будут проигрышными, значит наш был выигрышный. При этом, при переборе всех вариантов многие будут повторяться, так что результаты нужно сохранять.
Код:
n = int(input())

mem = {}

def run(n):
    if n in mem:
        return mem[n]
    for i in range(n // 2 + n % 2 - 1, 0, -1):
        tn = n - i
        if run(tn) > 0:
            continue
        mem[n] = i
        return i
    mem[n] = 0
    return 0

print(run(n))
Про умножение. Пока ничего лучше перебора в лоб не придумал:
Код:
n = int(input())
a = 1
b = 1
pr = 1
while pr != n:
    while pr < n:
        b += 1
        pr *= b
    while pr > n:
        pr //= a
        a += 1
print(a, b)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 28.05.2020 в 17:53.
BDA вне форума Ответить с цитированием
Старый 30.05.2020, 19:19   #49
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Пять заданий которых я никак не смог выполнить:
1)Дан текст: в первой строке записано число строк, далее идут сами строки. Определите, сколько различных слов содержится в этом тексте.

Словом считается последовательность непробельных символов идущих подряд, слова разделены одним или большим числом пробелов или символами конца строки.

Мой вариант (который не работает):
Код:
n = int(input())
strings = []
string = ''
for i in range(n):
    string = string + input() + ' '
string = string.replace(',', '')
string = string.replace('.', '')
string = string.replace('!', '')
string = string.replace('?', '')
string = string.replace(':', '')
string = string.replace(';', '')
string = string.lower()
string = string.split()
for i in string:
    if i not in strings:
        strings.append(i)
print(len(strings))
Примечание: Для следуюших заданий у меня не будет своего варианта.

2)Август и Беатриса играют в игру. Август загадал натуральное число от 1 до n. Беатриса пытается угадать это число, для этого она называет некоторые множества натуральных чисел. Август отвечает Беатрисе YES, если среди названных ей чисел есть задуманное или NO в противном случае. После нескольких заданныъх вопросов Беатриса запуталась в том, какие вопросы она задавала и какие ответы получила и просит вас помочь ей определить, какие числа мог задумать Август.

В первой строке задано n - максимальное число, которое мог загадать Август. Далее каждая строка содержит вопрос Беатрисы (множество чисел, разделенных пробелом) и ответ Августа на этот вопрос.

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

3)Август и Беатриса продолжают играть в игру, но Август начал жульничать. На каждый из вопросов Беатрисы он выбирает такой вариант ответа YES или NO, чтобы множество возможных задуманных чисел оставалось как можно больше. Например, если Август задумал число от 1 до 5, а Беатриса спросила про числа 1 и 2, то Август ответит NO, а если Беатриса спросит про 1, 2, 3, то Август ответит YES.

Если же Бетриса в своем вопросе перечисляет ровно половину из задуманных чисел, то Август из вредности всегда отвечает NO. Наконец, Август при ответе учитывает все предыдущие вопросы Беатрисы и свои ответы на них, то есть множество возможных задуманных чисел уменьшается.

Первая строка содержит наибольшее число, которое мог загадать Август. Каждая следующая строка содержит очередной вопрос Беатрисы: набор чисел, разделенных пробелами. Последняя строка входных данных содержит одно слово HELP.

Для каждого вопроса Беатрисы выведите ответ Августа на этот вопрос. После этого выведите через пробел, в порядке возрастания, все числа, которые мог загадать Август после ответа на все вопросы Беатрисы.

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

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

В первой строке выведите количество языков, которые знают все школьники. Начиная со второй строки - список таких языков. Затем - количество языков, которые знает хотя бы один школьник, на следующих строках - список таких языков. Языки нужно выводить в лексикографическом порядке, по одному на строке.

5)Политическая жизнь одной страны очень оживленная. В стране действует K политических партий, каждая из которых регулярно объявляет национальную забастовку. Дни, когда хотя бы одна из партий объявляет забастовку, при условии, что это не суббота или воскресенье (когда и так никто не работает), наносят большой ущерб экономике страны.

i-я партия объявляет забастовки строго каждые b_i дней, начиная с дня с номером a_i. То есть i-я партия объявляет забастовки в дни a_i, a_i + b_i, a_i + 2 * b_i и т.д. Если в какой-то день несколько партий объявляет забастовку, то это считается одной общенациональной забастовкой.

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

В первой строке даны числа N и K. Далее идет K строк, описывающие графики проведения забастовок. i-я строка содержит числа a_i и b_i. Вам нужно определить число забастовок, произошедших в этой стране в течении года.
FsGaCh вне форума Ответить с цитированием
Старый 30.05.2020, 20:28   #50
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Все эти задачи на освоение множеств.
1)
Цитата:
Сообщение от FsGaCh Посмотреть сообщение
Определите, сколько различных слов содержится в этом тексте.
Код:
n = int(input())
words = set()
for i in range(n):
    words.update(input().split(' '))
if '' in words:
    words.remove('')
print(len(words))
В этом решении слова в разном регистре будут считаться разными.

Для следующих задач дам наводки, чтобы вы могли их сами решить.
2)
Цитата:
Сообщение от FsGaCh Посмотреть сообщение
Вы должны вывести через пробел, в порядке возрастания, все числа, которые мог задумать Август
Завести множество A с элементами от 1 до N. Затем считывать строки и проверять ответ Августа. Если ответ YES, то делать пересечение (intersection) множества A с заданными числами Беатрисы. Если ответ NO, то делать вычитание (difference) из множества A заданных чисел Беатрисы. Потом напечатать оставшееся множество.

3)
Цитата:
Сообщение от FsGaCh Посмотреть сообщение
Август и Беатриса продолжают играть в игру, но Август начал жульничать.
Завести множество A с элементами от 1 до N. Затем считывать строку и преобразовывать во множество. Рассчитать множества при ответе YES и NO. Сравнить их длины. Если длина множества NO больше или равна длине множества YES, то ответ NO, иначе YES. Множество A заменяется на одно из рассчитанных множеств в соответствии с ответом.

4)
Цитата:
Сообщение от FsGaCh Посмотреть сообщение
определить сколько языков знают все школьники, и сколько языков знает хотя бы один из школьников
Нужно просто найти пересечение и объединение всех заданных множеств языков.

5)
Цитата:
Сообщение от FsGaCh Посмотреть сообщение
нужно определить число забастовок, произошедших в этой стране в течении года
Самое простое решение перебором. Перебрать все дни от 1 до N. Если номер P дня делится без остатка на 6 или 7, то пропустить его. Иначе проверить для каждого графика забастовок условие (P - Ai) % Bi == 0, если хотя бы один график подходит, то в этот день есть забастовка.

Чтобы формально использовать множества. Можно для каждого графика получить множество его дней set(range(a, n + 1, b)). Затем найти объединение всех таких множеств. Затем вычесть множества с субботами и воскресеньями.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 07.06.2020 в 19:36.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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