1216 - Echer: Difference between revisions

From Bitnami MediaWiki
Raul (talk | contribs)
Pagină nouă: Oli are un echer de forma unui triunghi dreptunghic, cu catetele de lungimi <code>L1</code> și <code>L2</code> unități, și o foaie de caiet de matematică cu <code>M</code> rânduri și <code>N</code> coloane de pătrățele având latura de o unitate. Oli a poziționat echerul în colțul din stânga sus al foii de hârtie, ca în imaginea alăturată și vrea să îl mute astfel încât să atingă colțul din dreapta jos al foii de hârtie cu oricare din colțurile e...
Tag: visualeditor
 
Raul (talk | contribs)
No edit summary
Tag: visualeditor
 
Line 38: Line 38:


=== Lipește codul aici ===
=== Lipește codul aici ===
1
<syntaxhighlight lang="python" line="1">
​def Echer():
​def Echer():


with open("echer.in", "r") as f:
with open("echer.in", "r") as f:


    cer, l1, l2, m, n = map(int, f.readline().split())
    cer, l1, l2, m, n = map(int, f.readline().split())


k = 0
k = 0


x = m // l1
x = m // l1


y = n // l2
y = n // l2


mi = min(x, y)
mi = min(x, y)


ma = max(x, y)
ma = max(x, y)


i = 0
i = 0


if x == y:
if x == y:


    k = 3 * x - 2
    k = 3 * x - 2


elif x - y == 1:
elif x - y == 1:


    k = 3 * y - 1
    k = 3 * y - 1


elif y - x == 1:
elif y - x == 1:


    k = 3 * x - 1
    k = 3 * x - 1


else:
else:


    k = 3 * mi - 2
    k = 3 * mi - 2


    k += 2 * (ma - mi)
    k += 2 * (ma - mi)


    if (ma - mi) % 2:
    if (ma - mi) % 2:


        k -= 1
        k -= 1


with open("echer.out", "w") as g:
with open("echer.out", "w") as g:


    if cer == 1:
    if cer == 1:


        g.write(str(k) + '\n')
        g.write(str(k) + '\n')


    else:
    else:


        g.write("1")
        g.write("1")


        k -= 1
        k -= 1


        for i in range(1, mi):
        for i in range(1, mi):


            g.write(" 2 3 1")
            g.write(" 2 3 1")


            k -= 3
            k -= 3


        if x == y:
        if x == y:


            g.write('\n')
            g.write('\n')


            return 0
            return 0


        elif x - y == 1:
        elif x - y == 1:


            g.write(" 4\n")
            g.write(" 4\n")


            return 0
            return 0


        elif y - x == 1:
        elif y - x == 1:


            g.write(" 2\n")
            g.write(" 2\n")


            return 0
            return 0


        if x - y > 1:
        if x - y > 1:


            while k >= 4:
            while k >= 4:


                g.write(" 4 6 3 1")
                g.write(" 4 6 3 1")


                k -= 4
                k -= 4


            if k:
            if k:


                g.write(" 4\n")
                g.write(" 4\n")


        elif y - x > 1:
        elif y - x > 1:


            while k >= 4:
            while k >= 4:


                g.write(" 2 7 5 1")
                g.write(" 2 7 5 1")


                k -= 4
                k -= 4


            if k:
            if k:


                g.write(" 2\n")
                g.write(" 2\n")


    return 0
    return 0
 
</syntaxhighlight>

Latest revision as of 13:50, 14 December 2023

Oli are un echer de forma unui triunghi dreptunghic, cu catetele de lungimi L1 și L2 unități, și o foaie de caiet de matematică cu M rânduri și N coloane de pătrățele având latura de o unitate.

Oli a poziționat echerul în colțul din stânga sus al foii de hârtie, ca în imaginea alăturată și vrea să îl mute astfel încât să atingă colțul din dreapta jos al foii de hârtie cu oricare din colțurile echerului, utilizând doar mutări de forma:

Cerința[edit]

Scrieţi un program care citeşte lungimile catetelor echerului, numărul de rânduri, respectiv numărul de coloane ale foii de hârtie și determină:

1. numărul minim de mutări K, prin care poate muta echerul din colțul din stânga sus al foii de matematică, astfel încât echerul să atingă colțul din dreapta jos al foii;

2. cele K mutări efectuate pentru a deplasa echerul din colțul din stânga sus al foii, până când un colț al echerului atinge colțul din dreapta jos al foii; dacă există mai multe soluții, se va afișa soluția minimă în sens lexicografic. Un șir de mutări X=(X1, X2, …, XK) este mai mic în sens lexicografic decât alt șir de mutări Y=(Y1, Y2, …, YK) dacă există P (1 ≤ P ≤ K) a.î. XI = YI, cu I din {1, 2, …, P-1} și XP < YP.

De exemplu șirul de mutări 1 2 3 1 este mai mic în sens lexicografic decât șirul de mutări 1 2 4 1.

Date de intrare[edit]

Fişierul de intrare echer.in conţine pe prima linie una dintre valorile 1 sau 2, reprezentând cerinţa 1 dacă se cere determinarea numărului minim de mutări prin care poate muta echerul din colțul din stânga sus al foii de matematică astfel încât să atingă colțul din dreapta jos al foii, respectiv cerinţa 2, dacă se cere determinarea mutărilor efectuate pentru a deplasa echerul din colțul din stânga sus al foii până când un colț al echerului atinge colțul din dreapta jos al foii.

A doua linie a fișierului conține patru numere naturale, separate prin câte un spațiu, reprezentând valorile L1, L2, M și N, în această ordine.

Date de ieșire[edit]

Fişierul de ieşire echer.out va conţine pe prima linie un număr natural K reprezentând numărul minim de mutări dacă cerința a fost 1, respectiv K numere naturale separate prin câte un spațiu reprezentând mutările efectuate pentru a deplasa echerul din colțul din stânga sus al foii de matematică până când un colț al echerului atinge colțul din dreapta jos al foii, dacă cerința a fost 2.

Restricții și precizări[edit]

  • 1 ≤ L1,L2 ≤ 1000.
  • 1 ≤ M,N ≤ 1000000.
  • Se garantează că există soluție pentru orice set de date de intrare.
  • Pentru rezolvarea corectă a cerinţei 1 se obţine 30% din punctaj.
  • Pentru rezolvarea corectă a cerinţei 2 se obţine 70% din punctaj.

Exemplul 1[edit]

echer.in

1
2 3 8 9

echer.out

8

Încărcare soluție[edit]

Lipește codul aici[edit]

<syntaxhighlight lang="python" line="1"> ​def Echer():

with open("echer.in", "r") as f:

   cer, l1, l2, m, n = map(int, f.readline().split())

k = 0

x = m // l1

y = n // l2

mi = min(x, y)

ma = max(x, y)

i = 0

if x == y:

   k = 3 * x - 2

elif x - y == 1:

   k = 3 * y - 1

elif y - x == 1:

   k = 3 * x - 1

else:

   k = 3 * mi - 2
   k += 2 * (ma - mi)
   if (ma - mi) % 2:
       k -= 1

with open("echer.out", "w") as g:

   if cer == 1:
       g.write(str(k) + '\n')
   else:
       g.write("1")
       k -= 1
       for i in range(1, mi):
           g.write(" 2 3 1")
           k -= 3
       if x == y:
           g.write('\n')
           return 0
       elif x - y == 1:
           g.write(" 4\n")
           return 0
       elif y - x == 1:
           g.write(" 2\n")
           return 0
       if x - y > 1:
           while k >= 4:
               g.write(" 4 6 3 1")
               k -= 4
           if k:
               g.write(" 4\n")
       elif y - x > 1:
           while k >= 4:
               g.write(" 2 7 5 1")
               k -= 4
           if k:
               g.write(" 2\n")
   return 0

</syntaxhighlight>