Mam takie zadanie: https://szkopul.edu.pl/c/archiwum-zadan-k0mpend1x/problemset/problem/WcGekusKan4LrK1VmvKxyhkM/site/?key=statement
Nie wiem kompletnie jak do tego podejść, moglibyście mi dać jakieś podpowiedzi ?
Pięć skrzyń. Ile par skrzyń?
(5) // to ma być symbol Newtona ;)
(2)
= 5!/(2!(5-2)!) = 10
Skrzynie a, b, c, d, e
Liczby diamentów w parach skrzyń d1, d2, d3.... d10
a + b = d1
a + c = d2
a + d = d3
a + e = d4
b + c = d5
b + d = d6
b + e = d7
c + d = d8
a + e = d9
d + e = d10
Wychodzi układ 10 równań z 5 niewiadomymi.
Poprawka
A jednak nie o to chodzi, ponieważ:
https://www.wolframalpha.com/input/?i=a%2Bb%3D10%2C+a%2Bc%3D12%2C+a%2Bd%3D16%2C+a%2Be%3D10%2C+b%2Bc%3D6%2C+b%2Bd%3D12%2C+b%2Be%3D18%2C+c%2Bd%3D8%2C+c%2Be%3D14%2C+d%2Be%3D14
Trzeba by rozwiązać 10! = 3 628 800 układów równań, żeby znaleźć wszystkie możliwe permutacje d1, d2, ... d10.
Dla 3
https://www.teachsecondary.com/zipfiles/lesson-plan-ks3-maths-arithmagons.pdf
Dla 4
https://www.foster77.co.uk/Foster,%20Symmetry%20Plus,%20Sums%20of%20Pairs.pdf
Dla 5
*dla 5 Pan Matematyk dr nauk nie umieścił w sieci
*
Sorry, ja mówię pass :)
Załóżmy, że mamy 5 liczb, są one różne, a zatem mamy tu pewien porządek:
a < b < c < d < e
z tego wynika, że:
a+b = MIN
d+e = MAX
min i max na podstawie wejściowych wartości mogę znaleźć
na razie nic mi to nie da, ale jeśli policzymy sumę, a można ją policzyć:
suma = wszystko / 2
to mogę wtedy wyliczyć środkowy element:
c = suma - MIN - MAX
a teraz od każdej wejściowej odejmuje c
dwie najmniejsze dodatnie wartości to a, ta ciut większa to b
niemal analogicznie rozpoznanie robię po drugiej stronie by rozpoznać d , e
EDIT, załączam przykład w pythonie:
xs = [10,12,16,10,6,12,18,8,14,14]
s = sum(xs) / 4
a_b = min(xs)
d_e = max(xs)
c = s - a_b - d_e
print(c)
diffs = sorted([x - c for x in xs if x - c > 0])
a = diffs[0]
b = diffs[1]
d = diffs[-2]
e = diffs[-1]
print(a, b, c, d, e)
pan_krewetek napisał(a):
a teraz od każdej wejściowej odejmuje c
dwie najmniejsze dodatnie wartości to a, ta ciut większa to b
Jeżeli skrzynie mają wartości od 1 do 5, to największa suma wyniesie 9, odejmiesz 3 i wyjdzie 6 (co jest niepoprawne).
Jak znajdziesz c, to następnie bierzesz dwie największe wartości M1 i M2, ich różnica M1 - M2 to różnica d - c. Masz już c, więc wyliczasz d. Potem wyliczenie e jest trywialne. Analogicznie dla najmniejszych wartości.
import itertools
elems = sorted([2, 5, 11, 30, 51])
xs = sorted([x[0] + x[1] for x in itertools.product(elems, elems) if x[0] < x[1]])
print(elems)
print(xs)
s = sum(xs) / 4
a_b = min(xs)
d_e = max(xs)
c = s - a_b - d_e
M1 = xs[-1]
M2 = xs[-2]
d = c + (M1 - M2)
e = M1 - d
m1 = xs[0]
m2 = xs[1]
b = c - (m2 - m1)
a = m1 - b
recoveredElems = [a, b, c, d, e]
recoveredXs = sorted([x[0] + x[1] for x in itertools.product(recoveredElems, recoveredElems) if x[0] < x[1]])
print(recoveredElems)
print(recoveredXs)
print(recoveredElems == elems)
print(recoveredXs == xs)
Przechodzi na 100pkt
#!/bin/python3
def main():
tab = sorted([int(input()) for i in range(10)])
skrzynie = [0, 0, 0, 0, 0]
skrzynie[2] = (sum(tab) / 4) - tab[0] - tab[-1]
skrzynie[0] = tab[1] - skrzynie[2]
skrzynie[1] = tab[0] - skrzynie[0]
skrzynie[3] = tab[2] - skrzynie[0] if tab[2] != skrzynie[1] + skrzynie[2] else tab[3] - skrzynie[0]
skrzynie[4] = tab[-1] - skrzynie[3]
print(int(skrzynie[int(input()) - 1]))
main()
:D