Олимпиадные задачи питон решение

Решение олимпиадных задач по информатике: Линейный футбол

Близнецам Петру и Павлу родители подарили на день рождения настольный футбол, но не простой, а линейный.
В этом варианте игры все фигурки игроков расположены в одну линию на равном расстоянии друг от друга. Всего есть n игроков. Для определённости пронумеруем их позиции числами от 1 до n слева направо. Ворота находятся в позициях 0 и n+1. Каждый игрок имеет свою силу удара и может при ударе по мячу перебросить его на фиксированное количество позиций другому игроку. Силу удара игрока на позиции i обозначим через ai, что означает, что после удара этого игрока мяч переместится на ai позиций. Если ai положительное, то мяч переместится вправо, в сторону увеличения номеров, а если ai отрицательное, то мяч переместится влево, в сторону уменьшения. Если после удара мяч попадает в позицию, меньшую либо равную 0, то засчитывается гол в левые ворота, а если в позицию, большую либо равную n+1, то в правые. Если после удара мяч попадает к другому игроку, то тот наносит следующий удар со своей силой, и игра продолжается.
Близнецы решили сыграть n игр, в i‑й из которых первый удар нанесёт игрок номер i. Для каждой игры выведите, в какие ворота будет забит мяч в этой игре (L, если в левые, R, если в правые, U, если гол никто не забьёт).

n = int(input()) players = [int(input()) for _ in range(n)] answer = '' for i in range(n): k = i while k + players[k] > -1 and k + players[k] < n: if players[k] + players[k + players[k]] != 0: k += players[k] else: answer += 'U' break if k + players[k] < 0: answer += 'L' elif k + players[k] >n - 1: answer += 'R' print(answer)
var n,i,k:integer; answer:string; players:array of integer; begin read(n); players := new integer[n]; for i := 0 to n - 1 do read(players[i]); answer := ''; for i := 0 to n - 1 do begin k := i; while (k + players[k] > -1) and (k + players[k] < n) do if players[k] + players[k + players[k]] <>0 then k := k + players[k] else begin answer := answer + 'U'; break end; if k + players[k] < 0 then answer := answer + 'L' else if k + players[k] >= n then answer := answer + 'R'; end; write(answer); end.

Источник

Решение олимпиадных задач по информатике: Линейный футбол

Близнецам Петру и Павлу родители подарили на день рождения настольный футбол, но не простой, а линейный.
В этом варианте игры все фигурки игроков расположены в одну линию на равном расстоянии друг от друга. Всего есть n игроков. Для определённости пронумеруем их позиции числами от 1 до n слева направо. Ворота находятся в позициях 0 и n+1. Каждый игрок имеет свою силу удара и может при ударе по мячу перебросить его на фиксированное количество позиций другому игроку. Силу удара игрока на позиции i обозначим через ai, что означает, что после удара этого игрока мяч переместится на ai позиций. Если ai положительное, то мяч переместится вправо, в сторону увеличения номеров, а если ai отрицательное, то мяч переместится влево, в сторону уменьшения. Если после удара мяч попадает в позицию, меньшую либо равную 0, то засчитывается гол в левые ворота, а если в позицию, большую либо равную n+1, то в правые. Если после удара мяч попадает к другому игроку, то тот наносит следующий удар со своей силой, и игра продолжается.
Близнецы решили сыграть n игр, в i‑й из которых первый удар нанесёт игрок номер i. Для каждой игры выведите, в какие ворота будет забит мяч в этой игре (L, если в левые, R, если в правые, U, если гол никто не забьёт).

n = int(input()) players = [int(input()) for _ in range(n)] answer = '' for i in range(n): k = i while k + players[k] > -1 and k + players[k] < n: if players[k] + players[k + players[k]] != 0: k += players[k] else: answer += 'U' break if k + players[k] < 0: answer += 'L' elif k + players[k] >n - 1: answer += 'R' print(answer)
var n,i,k:integer; answer:string; players:array of integer; begin read(n); players := new integer[n]; for i := 0 to n - 1 do read(players[i]); answer := ''; for i := 0 to n - 1 do begin k := i; while (k + players[k] > -1) and (k + players[k] < n) do if players[k] + players[k + players[k]] <>0 then k := k + players[k] else begin answer := answer + 'U'; break end; if k + players[k] < 0 then answer := answer + 'L' else if k + players[k] >= n then answer := answer + 'R'; end; write(answer); end.

Источник

Читайте также:  Html template xml data

Решение олимпиадных задач по информатике: Антон и арбузы

На лето родители отправили Антона к бабушке помогать ей выращивать в огороде арбузы. Чтобы они выросли большими и вкусными, требуется поливать растения каждый день, что и было поручено мальчику. Если арбуз был полит, он вырастает на один килограмм (а если не был, то остаётся прежнего размера) за каждый день. Сам огород представляет собой прямоугольную сетку из n строк и m столбцов, в каждой ячейке которой растёт арбуз, изначально имеющий массу 0 килограмм. Антон очень не любит работать, поэтому в i-й день из всех d, что он будет гостить у бабушки, планирует поливать только арбузы, лежащие на пересечении первых xi строк и первых yi столбцов.
В конце лета за свою работу мальчик получит самый большой арбуз из имеющихся в огороде (а если их несколько, то сразу все самые большие!). Антон очень любит гигантские арбузы, поэтому просит вас определить, сколько же их в итоге ему достанется, и какого они будут веса.

n, m, d = int(input()), int(input()), int(input()) field = [] for _ in range(n): field.append([0] * m) for _ in range(d): xi, yi = int(input()), int(input()) for x in range(xi): for y in range(yi): field[x][y] += 1 largest = 0 for row in field: for elem in row: if elem > largest: largest = elem count = 0 for row in field: for elem in row: if elem == largest: count += 1 print(count, largest)
n, m, d = int(input()), int(input()), int(input()) field = [[0] * m for _ in range(n)] for _ in range(d): xi, yi = int(input()), int(input()) for x in range(xi): for y in range(yi): field[x][y] += 1 largest = max([max(row) for row in field]) count = sum([row.count(largest) for row in field]) print(count, largest)
var x,y,xi,yi,i,n,m,d,count,largest:integer; field:array[,] of integer; begin read(n); read(m); read(d); field := new integer[n, m]; for i := 1 to d do begin read(xi); read(yi); for x := 0 to xi - 1 do for y := 0 to yi - 1 do field[x, y] := field[x, y] + 1 end; largest := 0; for x := 0 to n - 1 do for y := 0 to m - 1 do if field[x, y] > largest then largest := field[x, y]; count := 0; for x := 0 to n - 1 do for y := 0 to m - 1 do if field[x, y] = largest then count := count + 1; write(count, ' ', largest); end.

Источник

Читайте также:  Php include file 404

Решения задач школьного этапа Всероссийской олимпиады школьников по информатике (9-11 классы)

Эта задача с открытыми тестами. Ее решением является набор ответов, а не программа на языке программирования. Тесты указаны в самом условии. От вас требуется лишь ввести ответы на них в тестирующую систему.

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

Вычислительная компания XYZ закупила новые экспериментальные компьютеры, но её сотрудники не знают, в какой системе счисления новые компьютеры выдают результаты их вычислений. Помогите им определить их результаты в традиционной десятичной системе, если известно, что последовательность цифр N, которую выдает экспериментальный компьютер, записана в минимально возможной для этого системе счисления.

  • Тест №1: N=123
  • Тест №2: N=796
  • Тест №3: N = 60452
  • Тест №4: N = 101001
  • Тест №5: N = 32674
  • Тест №6: N = 306973
  • Тест №7: N = 123042
  • Тест №8: N = 202122
  • Тест №9: N = 871856
  • Тест №10: N = 125341

Решение

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

  • int( max(n) ) + 1 — максимальный символ в строке n переводим в целое число + 1
  • преводим строковое представление числа n с найденным основанием в целое десятичное число: int( строка, основание) (если основание не указано — сторка в десятичном представлении)
for i in range(10): n = input() print ( int( n, int( max(n) ) + 1 ) ) 
123 27 796 796 60452 14639 101001 41 32674 13756 306973 306973 123042 4772 202122 557 871856 519747 125341 11581

Задача B. Улиточные бега

  • Имя входного файла: стандартный ввод
  • Имя выходного файла: стандартный вывод
  • Ограничение по времени: 1 секунда
  • Ограничение по памяти: 256 мегабайт

Каждые 100 лет в Стране Улиток проводятся улиточные бега на дистанции L сантиметров. Это станет для вас неожиданностью, но в этом столетии они проводятся именно сегодня!

В этом году организаторы приняли решение провести бега на новой трассе — прямоугольнике размера A × B сантиметров. Согласно правилам, участники начнут бежать из нижнего левого угла прямоугольника против часовой стрелки в соответствии со схемой ниже:

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

Читайте также:  Python работа с pcap

Формат входных данных

Вводятся три целых числа A, B, L (2

Формат выходных данных

Выведите TOP, если улитка остановится на верхней стороне прямоугольника, BOTTOM — на нижней, LEFT — на левой, RIGHT — на правой стороне прямоугольника.

Примеры

Решение

После преодаления дистанции равной периметру прямоугольника 2(a+b) — история со сторонами повтаряется. Поэтому достаточно взять не всю дистанцию l, а ее остаток на длину периметра l = l % 2(a+b). Далее, сравниваем l с длиной сторон в рамках одного периметра: до a — нижняя, иначе до a+b — правая, иначе до 2a+b — верхняя и иначе — левая

a,b,l=int(input()), int(input()), int(input()) l %= 2*(a+b) print (la and 'BOTTOM' or l(a+b) and 'RIGHT' or l(a+a+b) and 'TOP' or 'LEFT') 

Задача C. Треугольник

  • Имя входного файла: стандартный ввод
  • Имя выходного файла: стандартный вывод
  • Ограничение по времени: 1 секунда
  • Ограничение по памяти: 256 мегабайт

На координатной плоскости расположены равнобедренный прямоугольный треугольник ABC с длиной катета d и точка X. Катеты треугольника лежат на осях координат, а вершины расположены в точках: A(0, 0), B(d, 0), C(0, d). Требуется написать программу, которая определяет взаимное расположение точки X и треугольника. Если точка X расположена внутри или на сторонах треугольника, выведите 1. Если же точка находится вне треугольника, выведите 0.

Формат входных данных

В первой строчке вводится натуральное число d (не превосходящее 1000), во второй — координата точки X по оси OX (целое число из диапазона от −1000 до 1000), в третьей координата точки X по оси OY (целое число из диапазона от −1000 до 1000).

Формат выходных данных

Если точка лежит внутри, на стороне треугольника или совпадает с одной из вершин, то выве- дите число 1. Если точка лежит вне треугольника, то выведите 0.

Примеры

Источник

Олимпиадная задача за 10 класс

Задача:
Тот факт, что «дважды два четыре», принимается без каких-либо сомнений, хотя доказательство этого факта не такое простое. Кроме того, сумма двух двоек также равна четырем. Другими словами, 2 + 2 = 4 и 2 * 2 = 4. Среди целых положительных чисел больше нет ни одной пары, у которой бы сумма и произведение были равны. Однако если одно из них нецелое, то таких чисел будет уже много, например, 3 + 1.5 = 3 + 1.5, 11 + 1.1 = 11 * 1.1 и другие.
Вам нужно для заданного целого N найти хотя бы одно число X, для которого сумма с числом N и произведение с N совпадают.

Задачу я решил, по-моему. Код ниже. На вход я подаю число 3

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
N = int(input()) if 1N1000: i = 0 s = 0 p = 0 while True: i += 0.1 s = N + i p = N * i с = s == p if с: print(i) break else: s = 0 p = 0

должно выполнятся, ибо 3*1.5 = 4.5 и 3+1.5 = 4.5 .
Смотрел на свой код через визуализатор, с = False почему-то. В чем может быть проблема? Заранее спасибо.

Источник

Оцените статью