Підготовка до олімпіади
Програмування (Python)
Списки
#Зчитування з файлу
#---------------------
#Вміст файлу:
#10
#---------------------
file=open('input.txt','r')
f=file.readlines()
f[0]=f[0].rstrip("\n")
N=int(f[0])
d=10
q=1
p=0
M=0
while p<N:
M=M+1
if M==d:
q=q+1
d=d*10
p=p+q
print('p=',p) #Виведення результату
#При n=10 результ p=11 - кількість застосованих цифр для нумерації сторінок від 1 по M
Середнє з чисел
Дано три різних числа a, b, c. Вивести середнє з них
#Зчитування з файлу
#---------------------
#Вміст файлу:
#10 54 7
#---------------------
file=open('input.txt','r')
f=file.readlines()
f[0]=f[0].rstrip("\n")
f=f[0].split(' ')
a=int(f[0])
b=int(f[1])
c=int(f[2])
s=(a+b+c)-(max(max(a,b),c)+min(min(a,b),c))
print(s)
#Результат: 10
Оптимальна купівля CD
Чисті компакт-диски продаються в різних упаковках: більша у 100 дисків коштує 100 грн, менша у 20 дисків - 30 грн, а один окремий диск коштує 2 грн. Якої мінімальної суми має вистачити для покупки N таких дисків?
#Зчитування з файлу
#---------------------
#Вміст файлу:
#235
#---------------------
file=open('input.txt','r')
f=file.readlines()
f[0]=f[0].rstrip("\n")
n=int(f[0])
a=n//100
n=n%100
b=n//20
c=n%20
x=a*100+b*30+c*2
y=a*100+(b+1)*30
z=(a+1)*100
if y<x:
x=y
if z<x:
x=z
print(x)
#Результат: 260
Кількість днів
Дано дві календарні дати. Знайти кількість днів між ними, включаючи початковий і кінцевий дні.
def Year(y):
year = 0
if y % 4 == 0 and y % 100 != 0 or y % 400 == 0:
year = 1
else:
year = 0
return year
def Month(m,y):
w = 31
if m == 2:
w = 28 + Year(y)
if m == 4 or m == 6 or m == 9 or m == 11:
w = 30
return w
def Count(d,m,y):
s = 0
for i in range(1,y):
s += 365 + Year(i)
for x in range(1, m):
s += Month(x, i)
s += d
return s
date_1 = input("Введіть 1 дату в форматі: '12.12.2022': ").split(".")
date_2 = input("Введіть 2 дату в форматі: '12.12.2022': ").split(".")
for i in range(3):
date_1[i] = int(date_1[i])
date_2[i] = int(date_2[i])
riz = Count(date_2[0],date_2[1],date_2[2]) - Count(date_1[0],date_1[1],date_1[2])+1
print(riz)
Модель годинника з боєм
Годинник з боєм відбиває кожної години таку кількість ударів, скільки їх є на циферблаті з цифрами від 1 до 12, та по одному разу тоді, коли хвилинна стрілка вказує на цифру 6. Знаючи початковий та кінцевий час однієї календарної доби (в годинах і хвилинах), обчислити загальну кількість ударів за цей проміжок часу.
#Уведення даних
chas1=input('Час перший (год.хв.)')
chas2=input('Другий перший (год.хв.)')
chas1=chas1.split(':')
chas2=chas2.split(':')
g1=int(chas1[0])
h1=int(chas1[1])
g2=int(chas2[0])
h2=int(chas2[1])
#Основна частина програми
c=0
t1=g1*60+h1
t2=g2*60+h2
for l in range(48):
t=l*30
if l%2!=0:
u=1
else:
u=(l%24)//2
if u==0:
u=12
if t1<=t and t<=t2:
c+=u
#Виведення результатів
print('Кількість ударів годинника: ', c)
Нулі в кінці запису N!
Підрахувати кількість нулів в кінці запису факторіала натурального числа N (N<=2*10^9)
#Функція
#Підраховує кількість дільників 5 заданого числа
def Dil5(m):
d=0
while m%5==0:
m=m//5
d+=1
return d
#Основна частина програми
n=int(input('N=?'))
k=0
for i in range(1,n+1):
k=k+Dil5(i)
print(k) #Кількість нулів в кінці запису факторіала заданого числа n
n=int(input('N=?'))
k=0
while n!=0:
n=n//5
k=k+n
print(k)
Симетрія чисел
Скільки існує N-значних паліндромів? (Паліндром - це число, що читається однаково в обох напрямках). N=1...1000.
def Back(x):
y=0
while x!=0:
y=y*10+(x%10)
x=x//10
return y
n=int(input('n=?'))
b=1
for i in range(1,n+1):
b=b*10
a=b//10
b=b-1
m=0
for i in range(a,b+1):
if i==Back(i):
m+=1
print(m)
Популяція роботів
A роботів за рік збирають C роботів, а B роботів - D роботів. На початку є N роботів. Яка найбільша кількість роботів може бути через K років?
def robot(r,a,b):
m=0
for x in range(r//a+1):
for y in range((r-a*x)//b+1):
if x*c+y*d>m:
m=x*c+y*d
return m
a=int(input('a='))
b=int(input('b='))
c=int(input('c='))
d=int(input('d='))
n=int(input('n='))
k=int(input('k='))
for i in range(1,k+1):
n=n+robot(n,a,b)
print('n=',n)