Як говорить мій колега, якщо замучили дистанційні курси, завітай на електронний ресурс з розв'язування олімпіадних задач з інформатики. З чого почати тренування в розв'язуванні олімпіадних задач з інформатики? Розберемося на прикладі популярної мови програмування Python.
Список ресурсів, відомих мені:
Інтернет-портал E-Olimp організаційно-методичного забезпечення дистанційних олімпіад з програмування для обдарованої молоді навчальних закладів України (м.Житомир).Всеукраїнський віртуальний центр олімпіад школярів "ОЛІМП" (м.Вінниця)NetOI - Всеукраїнський центр проведення олімпіад школярів з інформатики в мережі Інтернет (м.Вінниця, попередній оновлений ресурс)https://new.netoi.org.ua/index_ua.php?lng=ua&cid=53
Тренувальний розділ сайту NetOI. Всі задачі для самостійного розв’язку та перевірки.Проект "Школа програміста" (Красноярский край).Київські учнівські олімпіади з інформатики. Проведення і результати.Львівська платформа автоматичного тестування та проведення змагань зі спортивного програмування з навчальними матеріалами у вільному доступі.Я працював з першими двома і досвід показав, що E-Olimp працює стабільніше, а NetOI чомусь у мене не прийняв коду на Python 3, хоча Python 2 прекрасно спрацював. Останні два ресурси цікаві набором задач.
Особливу увагу зверніть на версії компіляторів, які потрібні в роботі (Python 3 або Python 2). Шляхи встановленя компіляторів бажано вибирати так, щоб каталоги мали довжину не більшу 8 символів та містили лише латиницю. Останнє стосується і назв написаних програм. З правилами написання коду можна ознайомитися:
E-OlimpNetOIСередовище програмування
https://www.python.org/downloads/windows/
Текстовий редактор Notepad++ для зручності набирання коду програми.
https://notepad-plus-plus.org/downloads/
Вивчити декілька команд командного рядка (в пункті головного меню Windows <Виконати> набрати Cmd або просто вибрати пункт меню Windows <Командний рядок>)
Перехід на відповідний локальний ресурс
d: # перехід на диск d
Перехід до папки, де будуть знаходитись коди програм
cd d:\DATA\Python\
Запуск інтерпретатора (для перевірки роботи окремих функцій і команд)
python
Вихід з интерпретатора
quit()
Запуск програмного коду на виконання
python proga.py
Для копіювання до командної строки можна використовувати праву кнопку мишки і <Копіювати>. Перехід між недавно використовуваними командами можна здійснювати за допомогою клавіш <Вгору> та <Вниз>.
Розглянемо два способи вводу-виводу у Python. Увага, читати і записувати в текстовий файл Python може лише строки.
Від/вивід з клавіатури
s = input() # введення строки в Python 3
s = raw_input() # введення в Python 2
n = int(input()) # введення цілого числа
print('Значення ПІ — приблизно {0:.3f}.'.format(math.pi)) # використання методу format
>>> '{0:.2f}'.format(4/3)
'1.33'
>>> '{0:10.2f}'.format(4/3)
' 1.33'
Файловий ввід/вивід. Файли потрібно попередньо створити.
f1=open('input.txt', 'r') # відкриття та підготовка файлу для читання даних
f2=open('output.txt', 'w') # відкриття та підготовка файлу для запису даних
n=f1.read() # читання всього файлу
f2.write(n[0]+' '+n[1]) # запис у файл
f1.close() # закриття файлів
f2.close()
Ось приклад вводу рядка дійсних чисел:
data=f1.read().split()
x1=float(data[0])
y1=float(data[1])
r1=float(data[2])
x2=float(data[3])
y2=float(data[4])
r2=float(data[5])
Приклад вводу даних з двох рядків в першому три числа, в другому п'ять чисел:
data=f1.readline().split()
a=float(data[0])
b=float(data[1])
c=float(data[2])
data=f1.readline().split()
x1=float(data[0])
y1=float(data[1])
x2=float(data[2])
y2=float(data[3])
z2=float(data[4])
Крім методу write для виводу можна використати команду
print('Hello, world!', file=f2)
Я пропоную використовувати останній спосіб, як кращий для тестування програми, так і для використання в реальний змаганнях, які не використовують електронну перевірку. Тепер спробуйте відправити свою першу програму.
Додаткова інформація нижче.
https://sites.google.com/site/pythontutorarticles/fajlovyj-vvod-vyvod
Перейдемо до практики. Завітайте на E-Olimp в розділ задачі та виберіть <Проста задача>.
Умова: програма зчитує двоцифрове число і виводить через пропуск кожну цифру окремо.
Вхідні дані: натуральне число на проміжку від 10 до 99 включно.
Вихідні дані: спочатку першу цифру числа і через пропуск другу.
Розв'язання: використовуючи файловий ввід/вивід, не має сенсу перетворювати дані в число, тому працюватимемо зі строкою. Читаємо строку з двох символів і просто виводимо посимвольно через пропуск.
f1=open('input.txt', 'r')
f2=open('output.txt', 'w')
n=f1.read()
f2.write(n[0]+' '+n[1])
f1.close()
f2.close()
Відправляємо на перевірку в пункті <Розв'язки> і не забуваємо відмітити присутність файлового обробітку.
Умова: підрахувати кількість цифр цілого невід'ємного числа n.
Вхідні дані: одне ціле невід'ємне число n (0 ≤ n ≤ 2 ∙10^9).
Вихідні дані: виведіть кількість цифр у числі n.
Розв'язання: використовуючи вищенаведені міркування, просто обрахуємо довжину строки, але акуратно, можливі ведучі нулі (00045) потрібно прибрати.
f1=open('input.txt', 'r')
f2=open('output.txt', 'w')
n=str(int(f1.read()))
f2.write(str(len(n)))
f1.close()
f2.close()
Підвищуємо складність! Геометрична задача.
Умова: визначити в скількох точках перетинаються два кола.
Умова: 6 чисел x1, y1, r1, x2, y2, r2, де x1, y1, x2, y2, - координати центрів кіл, r1, r2 – їх радіуси. Всі числа - дійсні, не перевищують 1000000000 за модулем, та задані не більш ніж з 3 знаками після коми.
Вихідні дані: кількість точок перетину. Якщо точок перетину нескінченно багато, то вивести -1.
Розв'язання: Програми доцільно писати з використанням функцій, тому створимо функцію, яка буде аналізувати розміщення кіл одне відносно іншого і повертатиме результат (спробуйте нарисувати кола):
def circles(x1,y1,r1,x2,y2,r2):
if x1==x2 and y1==y2 and r1==r2: # кола співпадають
return -1
if (x1-x2)**2 + (y1-y2)**2 >= r1**2: # центр другого кола зовні кола
if (x1-x2)**2 + (y1-y2)**2 > (r1 + r2)**2:
return 0
elif (x1-x2)**2 + (y1-y2)**2 == (r1 + r2)**2:
return 1
else:
return 2
else: # центр другого кола всередині кола
if (x1-x2)**2 + (y1-y2)**2 > (r1 - r2)**2:
return 2
elif (x1-x2)**2 + (y1-y2)**2 == (r1 - r2)**2:
return 1
else:
return 0
f1=open('input.txt', 'r')
f2=open('output.txt', 'w')
data=f1.read().split()
x1=float(data[0])
y1=float(data[1])
r1=float(data[2])
x2=float(data[3])
y2=float(data[4])
r2=float(data[5])
result=circles(x1,y1,r1,x2,y2,r2)
f2.write(str(result)) # не забуваємо перетворити число в строку для запису в файл
f1.close()
f2.close()
Ще складніше :) За складністю можна фільтрувати.
Умова: у пустій прямокутній кімнаті розмірами A x B x C (довжина, ширина, висота) на підлогу впала муха, що заснула. Павук, що знаходився на одній із стін, або на підлозі кімнати, почав рухатись до неї по найкоротшому шляху. На яку відстань він при цьому переміститься?
Вхідні дані: у першому рядку задано розміри кімнати A, B, C. У другому рядку - координати мухи на підлозі X1, Y1, та павука X2, Y2, Z2. Всі вхідні дані - цілі числа, що не перевищують 500.
Вихідні дані: єдине число - відстань, на яку переміститься павук, обрахована з точністю до 2-х знаків після коми.
Розв'язання: Теж геометрична задача з використанням системи координат та аналізом розміщення павука. Рисуйте кімнату і нехай стіни "впадуть"!
import math
def smin(a,b,d): # функція визначення мінімальної відстані
return math.sqrt(d**2+(a+b)**2)
def minimum(a,b,c,x1,y1,x2,y2,z2): # основна процедура
s=0.0
if z2==0:
s=math.sqrt((x1-x2)**2 + (y1-y2)**2)
elif x2==0:
s=smin(x1,z2,abs(y2-y1))
elif x2==a:
s=smin(a-x1,z2,abs(y2-y1))
elif y2==0:
s=smin(y1,z2,abs(x2-x1))
elif y2==b:
s=smin(b-y1,z2,abs(x2-x1))
return s
f1=open('input.txt', 'r')
f2=open('output.txt', 'w')
data=f1.readline().split()
a=float(data[0])
b=float(data[1])
c=float(data[2])
data=f1.readline().split()
x1=float(data[0])
y1=float(data[1])
x2=float(data[2])
y2=float(data[3])
z2=float(data[4])
result=minimum(a,b,c,x1,y1,x2,y2,z2)
f2.write(str('{:.2f}'.format(result)))
f1.close()
f2.close()
Успіхів!
Якщо виникли запитання, прошу надіслати. Всі контакти на головній сторінці.
Умова: дано число Ch в десятковій системі числення. Написати програму що переводить дане число в систему числення з основою m.
Технічні умови: програма читає з клавіатури в першому рядку число m (2 ≤ m ≤ 16), в другому - число Ch (0 ≤ Ch ≤ 2+10^9) в десятковій системі. Програма виводить на екран відповідь в вигляді текстового рядка.
Приклад.
Введення:
16
1024
Виведення:
400
Розв'язання: Щоб забезпечити технічні умови, використаємо стандартний ввід/вивід. Але обробку будемо здійснювати за допомогою рекурсії (потрібно створити нову лекцію :)).
def convert(x, m):
cyfra='0123456789ABCDEF'
if x<m:
return cyfra[x]
else:
return convert(x // m, m) + cyfra[x % m]
m = int(raw_input())
Ch = int(raw_input())
print (convert(Ch, m))
Успіхів!
Якщо виникли запитання, прошу надіслати. Всі контакти на головній сторінці.
2019 рік
2018 рік
2017 рік