<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RaulOtet</id>
	<title>Bitnami MediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RaulOtet"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/RaulOtet"/>
	<updated>2026-05-01T04:31:12Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3341_-_oaste2&amp;diff=10220</id>
		<title>3341 - oaste2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3341_-_oaste2&amp;diff=10220"/>
		<updated>2024-08-11T06:47:22Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pe un continent reprezentat printr-o matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane se află mai multe state, toate în conflict. Astfel, fiecare si-a mobilizat oastea. Fiecare element al matricei reprezintă o regiune.  Două elemente, din matrice, învecinate pe linie sau pe coloană (nu si pe diagonală) reprezintă două regiuni care aparțin aceluiași stat.   Un element din matrice ce contine cifra &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; este o regiune neutră care delimitează stat...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pe un continent reprezentat printr-o matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane se află mai multe state, toate în conflict. Astfel, fiecare si-a mobilizat oastea. Fiecare element al matricei reprezintă o regiune.&lt;br /&gt;
&lt;br /&gt;
Două elemente, din matrice, învecinate pe linie sau pe coloană (nu si pe diagonală) reprezintă două regiuni care aparțin aceluiași stat. &lt;br /&gt;
&lt;br /&gt;
Un element din matrice ce contine cifra &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; este o regiune neutră care delimitează statele si nu are soldați. &lt;br /&gt;
&lt;br /&gt;
Elementul ce conține o cifră &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; nenulă este o regiune ce aparține unui stat și are &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; soldați.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se determine numărul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; maxim de soldați dintr-un stat al continentului precum și numărul &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; minim de regiuni pe care le poate avea un stat cu &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; soldati.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;oaste2.in&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, iar pe fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii conține câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; cifre, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;oaste2.out&amp;lt;/code&amp;gt; va conține pe prima linie cele două numere &amp;lt;code&amp;gt;S R&amp;lt;/code&amp;gt; separate printr-un spațiu, cu semnificația din enunț&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; vor fi numere naturale cu valori intre &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; inclusiv;&lt;br /&gt;
* fiecare element al matricei va avea valori naturale cuprinse intre &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; inclusiv;&lt;br /&gt;
* există cel puțin o cifră nenula în matrice&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;oaste2.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 6&lt;br /&gt;
 0 1 1 0 2 9&lt;br /&gt;
 9 0 2 0 1 0&lt;br /&gt;
 0 1 1 0 0 2&lt;br /&gt;
 0 0 1 1 1 1&lt;br /&gt;
&amp;lt;code&amp;gt;oaste2.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 12 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Harta din fișierul de intrare contine &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; state având: &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt; soldați (culoarea rosu – &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; regiuni), &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt; soldați (culoare galben – &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; regiuni), &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; soldați (culoare verde – &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; regiune)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def in_bounds(x, y, n, m):&lt;br /&gt;
    return 0 &amp;lt;= x &amp;lt; n and 0 &amp;lt;= y &amp;lt; m&lt;br /&gt;
&lt;br /&gt;
def dfs(matrix, visited, x, y, n, m):&lt;br /&gt;
    stack = [(x, y)]&lt;br /&gt;
    visited[x][y] = True&lt;br /&gt;
    soldiers_sum = 0&lt;br /&gt;
    region_size = 0&lt;br /&gt;
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]&lt;br /&gt;
    state_value = matrix[x][y]&lt;br /&gt;
    &lt;br /&gt;
    while stack:&lt;br /&gt;
        cx, cy = stack.pop()&lt;br /&gt;
        soldiers_sum += matrix[cx][cy]&lt;br /&gt;
        region_size += 1&lt;br /&gt;
        &lt;br /&gt;
        for dx, dy in directions:&lt;br /&gt;
            nx, ny = cx + dx, cy + dy&lt;br /&gt;
            if in_bounds(nx, ny, n, m) and not visited[nx][ny] and matrix[nx][ny] == state_value:&lt;br /&gt;
                visited[nx][ny] = True&lt;br /&gt;
                stack.append((nx, ny))&lt;br /&gt;
    &lt;br /&gt;
    return soldiers_sum, region_size&lt;br /&gt;
&lt;br /&gt;
def find_strongest_state(matrix):&lt;br /&gt;
    n = len(matrix)&lt;br /&gt;
    m = len(matrix[0])&lt;br /&gt;
    visited = [[False] * m for _ in range(n)]&lt;br /&gt;
    &lt;br /&gt;
    max_soldiers = 0&lt;br /&gt;
    min_regions = float(&#039;inf&#039;)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrix[i][j] != 0 and not visited[i][j]:&lt;br /&gt;
                soldiers, regions = dfs(matrix, visited, i, j, n, m)&lt;br /&gt;
                if soldiers &amp;gt; max_soldiers:&lt;br /&gt;
                    max_soldiers = soldiers&lt;br /&gt;
                    min_regions = regions&lt;br /&gt;
                elif soldiers == max_soldiers:&lt;br /&gt;
                    min_regions = min(min_regions, regions)&lt;br /&gt;
    &lt;br /&gt;
    return max_soldiers, min_regions&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare:&lt;br /&gt;
matrix = [&lt;br /&gt;
    [1, 1, 0, 3],&lt;br /&gt;
    [1, 0, 3, 3],&lt;br /&gt;
    [2, 2, 2, 0],&lt;br /&gt;
    [2, 0, 0, 0]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
max_soldiers, min_regions = find_strongest_state(matrix)&lt;br /&gt;
print(f&amp;quot;Număr maxim de soldați: {max_soldiers}, Număr minim de regiuni: {min_regions}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2385_-_oaste&amp;diff=10219</id>
		<title>2385 - oaste</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2385_-_oaste&amp;diff=10219"/>
		<updated>2024-08-11T06:46:07Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pe un continent reprezentat printr-o matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane se află mai multe state, toate în conflict. Astfel, fiecare si-a mobilizat oastea.   Fiecare element al matricei memorează câte o cifră. Două elemente învecinate pe linie sau pe coloană (nu si pe diagonală) aparțin aceluiași stat și se numesc regiuni.   O poziție &amp;lt;code&amp;gt;(i,j)&amp;lt;/code&amp;gt; a unei regiuni din matrice este dată de indicele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; de linie și indicele &amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pe un continent reprezentat printr-o matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane se află mai multe state, toate în conflict. Astfel, fiecare si-a mobilizat oastea. &lt;br /&gt;
&lt;br /&gt;
Fiecare element al matricei memorează câte o cifră. Două elemente învecinate pe linie sau pe coloană (nu si pe diagonală) aparțin aceluiași stat și se numesc regiuni. &lt;br /&gt;
&lt;br /&gt;
O poziție &amp;lt;code&amp;gt;(i,j)&amp;lt;/code&amp;gt; a unei regiuni din matrice este dată de indicele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; de linie și indicele &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; coloană al elementului din matrice corespunzător acestei regiuni. &lt;br /&gt;
&lt;br /&gt;
O poziție din matrice ce contine cifra &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; este o regiune neutră si nu are soldați, iar poziția ce conține o cifră &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; nenulă este o regiune ce aparține unui stat și are &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; soldați.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se determine numărul maxim de soldați dintr-o regiune a statului care are cei mai mulți soldați, precum și poziția acestei regiuni în matrice (linia și coloana).&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;oaste.in&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, iar pe fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii conține câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; cifre, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;oaste.out&amp;lt;/code&amp;gt; va conține pe prima linie trei numere separate prin cate un spațiu, reprezentând numărul maxim de soldați dintr-o regiune a statului care are cei mai mulți soldați, respectiv linia și coloana poziției acestei regiuni in matrice.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; vor fi numere naturale cu valori intre &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; inclusiv;&lt;br /&gt;
* fiecare element al matricei va avea valori naturale cuprinse intre &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; inclusiv;&lt;br /&gt;
* există cel puțin o cifră nenula în matrice&lt;br /&gt;
* spunem ca un stat are coordonatele &amp;lt;code&amp;gt;(i,j)&amp;lt;/code&amp;gt; în matrice dacă regiunea din poziția &amp;lt;code&amp;gt;(i,j)&amp;lt;/code&amp;gt; aparține acestui stat și este regiunea cu cea mai mică poziție în sens lexicografic dintre regiunile statului.&lt;br /&gt;
* perechea &amp;lt;code&amp;gt;(i,j)&amp;lt;/code&amp;gt; este mai mică în sens lexicografic ca perechea &amp;lt;code&amp;gt;(x,y)&amp;lt;/code&amp;gt; dacă &amp;lt;code&amp;gt;i&amp;lt;x&amp;lt;/code&amp;gt; sau dacă &amp;lt;code&amp;gt;i=x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;y&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă există două state cu același număr de soldați și același număr maxim de soldați într-o regiune, se va lua în considerare regiunea cu cea mai mică poziție din statul cu coordonatele cele mai mici în sens lexicografic&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;oaste.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 6&lt;br /&gt;
 0 1 1 0 2 5&lt;br /&gt;
 9 0 2 0 1 0&lt;br /&gt;
 0 1 1 0 0 2&lt;br /&gt;
 0 0 1 1 1 1&lt;br /&gt;
&amp;lt;code&amp;gt;oaste.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Harta din fișierul de intrare contine &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; state. Statul cu culoarea rosie in imagine are cei mai multi soldati iar regiunea din pozitia &amp;lt;code&amp;gt;(2,3)&amp;lt;/code&amp;gt; are cei mai multi soldati referitor la celelalte regiuni din acest stat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def in_bounds(x, y, n, m):&lt;br /&gt;
    return 0 &amp;lt;= x &amp;lt; n and 0 &amp;lt;= y &amp;lt; m&lt;br /&gt;
&lt;br /&gt;
def dfs(matrix, visited, x, y, n, m):&lt;br /&gt;
    stack = [(x, y)]&lt;br /&gt;
    visited[x][y] = True&lt;br /&gt;
    soldiers_sum = 0&lt;br /&gt;
    positions = [(x, y)]&lt;br /&gt;
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]&lt;br /&gt;
    &lt;br /&gt;
    while stack:&lt;br /&gt;
        cx, cy = stack.pop()&lt;br /&gt;
        soldiers_sum += matrix[cx][cy]&lt;br /&gt;
        for dx, dy in directions:&lt;br /&gt;
            nx, ny = cx + dx, cy + dy&lt;br /&gt;
            if in_bounds(nx, ny, n, m) and not visited[nx][ny] and matrix[nx][ny] == matrix[cx][cy]:&lt;br /&gt;
                visited[nx][ny] = True&lt;br /&gt;
                stack.append((nx, ny))&lt;br /&gt;
                positions.append((nx, ny))&lt;br /&gt;
    &lt;br /&gt;
    return soldiers_sum, positions[0]&lt;br /&gt;
&lt;br /&gt;
def find_strongest_region(matrix):&lt;br /&gt;
    n = len(matrix)&lt;br /&gt;
    m = len(matrix[0])&lt;br /&gt;
    visited = [[False] * m for _ in range(n)]&lt;br /&gt;
    &lt;br /&gt;
    max_soldiers = 0&lt;br /&gt;
    best_position = (-1, -1)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if matrix[i][j] != 0 and not visited[i][j]:&lt;br /&gt;
                soldiers, position = dfs(matrix, visited, i, j, n, m)&lt;br /&gt;
                if soldiers &amp;gt; max_soldiers:&lt;br /&gt;
                    max_soldiers = soldiers&lt;br /&gt;
                    best_position = position&lt;br /&gt;
    &lt;br /&gt;
    return max_soldiers, best_position&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare:&lt;br /&gt;
matrix = [&lt;br /&gt;
    [1, 1, 0, 3],&lt;br /&gt;
    [1, 0, 3, 3],&lt;br /&gt;
    [2, 2, 2, 0],&lt;br /&gt;
    [2, 0, 0, 0]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
max_soldiers, position = find_strongest_region(matrix)&lt;br /&gt;
print(f&amp;quot;Maxim soldați: {max_soldiers}, Poziție: {position}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3569_-_Cern&amp;diff=10218</id>
		<title>3569 - Cern</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3569_-_Cern&amp;diff=10218"/>
		<updated>2024-08-08T06:12:29Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: „CERN este un acronim folosit pentru a desemna Laboratorul European pentru Fizica Particulelor Elementare. Acronimul s-a păstrat de la vechea denumire în limba franceză, şi anume Conseil Européen pour la Recherche Nucléaire. Acesta este cel mai mare laborator de cercetare a particulelor elementare din lume, situat în suburbia nord-vestică a Genevei, chiar pe graniţa dintre Elveţia şi Franţa. Funcţia primară a complexului CERN este de a furniza acceleratoare de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;„CERN este un acronim folosit pentru a desemna Laboratorul European pentru Fizica Particulelor Elementare. Acronimul s-a păstrat de la vechea denumire în limba franceză, şi anume Conseil Européen pour la Recherche Nucléaire. Acesta este cel mai mare laborator de cercetare a particulelor elementare din lume, situat în suburbia nord-vestică a Genevei, chiar pe graniţa dintre Elveţia şi Franţa. Funcţia primară a complexului CERN este de a furniza acceleratoare de particule elementare şi alte tipuri de infrastructuri necesare fizicii particulelor de energii înalte.”&lt;br /&gt;
&lt;br /&gt;
Acceleratorul de particule CERN este dispus sub forma a &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; cercuri cu aceeaşi rază, tangente exterioare două câte două, numerotate pe figură cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Traiectoria unei particule elementare porneşte din unul din punctele marcate pe figură cu &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; şi se deplasează cu viteză constantă de &lt;br /&gt;
&lt;br /&gt;
/unitatea de timp numai pe circumferinţa cercurilor. La trecerea printr-un punct de tangenţă dintre două cercuri particula îşi schimbă atât sensul de deplasare, cât şi cercul pe care se deplasează. Astfel, dacă sensul de deplasare a fost la un moment dat trigonometric, la trecerea printr-un punct de tangenţă devine invers trigonometric şi dacă sensul de deplasare a fost invers trigonometric, la trecerea printr-un punct de tangenţă devine trigonometric.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Ştiind că cercurile ce formează acceleratorul sunt marcate din grad în grad începând cu &lt;br /&gt;
, în sens trigonometric (aşa cum se indică în figura alăturată), să se scrie un program, care, cunoscând punctul iniţial şi sensul de deplasare al unei particule, să determine poziţia particulei în accelerator după un număr dat de unităţi de timp.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Prima linie a fişierului de intrare &amp;lt;code&amp;gt;cern.in&amp;lt;/code&amp;gt; conţine un caracter &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; ce indică punctul de plecare al particulei.&lt;br /&gt;
&lt;br /&gt;
A doua linie a fişierului de intrare conţine două numere întregi &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, separate printr-un spaţiu, ce indică sensul de deplasare (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pentru sens trigonometric şi &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; pentru sens invers trigonometric), respectiv numărul de unităţi de timp cât durează deplasarea.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pe prima linie a fişierului de ieşire &amp;lt;code&amp;gt;cern.out&amp;lt;/code&amp;gt; se vor scrie două numere naturale &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, separate printr-un spaţiu, ce reprezintă numărul de grade, în sens trigonometric, respectiv cercul, corespunzătoare poziţiei finale unde se va găsi particula după trecerea celor &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; unităţi de timp.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;p ∈ {’A’,’B’,’C’,’D’,’E’,’F’}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;s ∈ {-1, 1}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ t ≤ 1.000.000.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ g ≤ 359&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;c ∈ {1, 2, 3}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru toate seturile de date de intrare, poziţia finală a particulei nu coincide cu unul dintre punctele de tangenţă dintre cercuri.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;cern.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 A&lt;br /&gt;
 1 320&lt;br /&gt;
&amp;lt;code&amp;gt;cern.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 200 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Particula pleacă din punctul &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; în sens trigonometric şi are traseul:&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
* pe cercul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în sens trigonometric;&lt;br /&gt;
*&lt;br /&gt;
* pe cercul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; în sens invers trigonometric;&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
* pe cercul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; în sens trigonometric.&lt;br /&gt;
&lt;br /&gt;
Poziţia finală este la &lt;br /&gt;
pe cercul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def determine_position(start_point, start_circle, start_direction, time_units):&lt;br /&gt;
    # Define circle tangents in degrees&lt;br /&gt;
    tangents = {0, 120, 240}&lt;br /&gt;
    &lt;br /&gt;
    # Define movement per unit time&lt;br /&gt;
    movement_per_unit = 10&lt;br /&gt;
    &lt;br /&gt;
    # Initialize current position, circle and direction&lt;br /&gt;
    current_position = start_point&lt;br /&gt;
    current_circle = start_circle&lt;br /&gt;
    current_direction = start_direction&lt;br /&gt;
    &lt;br /&gt;
    # Perform movement for each time unit&lt;br /&gt;
    for _ in range(time_units):&lt;br /&gt;
        if current_direction == &#039;trigonometric&#039;:&lt;br /&gt;
            current_position = (current_position + movement_per_unit) % 360&lt;br /&gt;
        else:&lt;br /&gt;
            current_position = (current_position - movement_per_unit) % 360&lt;br /&gt;
            &lt;br /&gt;
        # Check if we hit a tangent point&lt;br /&gt;
        if current_position in tangents:&lt;br /&gt;
            # Change circle&lt;br /&gt;
            current_circle = 1 if current_circle == 3 else current_circle + 1&lt;br /&gt;
            # Change direction&lt;br /&gt;
            if current_direction == &#039;trigonometric&#039;:&lt;br /&gt;
                current_direction = &#039;inverse trigonometric&#039;&lt;br /&gt;
            else:&lt;br /&gt;
                current_direction = &#039;trigonometric&#039;&lt;br /&gt;
    &lt;br /&gt;
    return current_position, current_circle&lt;br /&gt;
&lt;br /&gt;
# Example usage&lt;br /&gt;
start_point = 0  # Initial position in degrees&lt;br /&gt;
start_circle = 1  # Starting on circle 1&lt;br /&gt;
start_direction = &#039;trigonometric&#039;  # Starting direction&lt;br /&gt;
time_units = 30  # Number of time units&lt;br /&gt;
&lt;br /&gt;
final_position, final_circle = determine_position(start_point, start_circle, start_direction, time_units)&lt;br /&gt;
print(f&amp;quot;Final position: {final_position} degrees on circle {final_circle}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3574_-_Perspic&amp;diff=10217</id>
		<title>3574 - Perspic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3574_-_Perspic&amp;diff=10217"/>
		<updated>2024-08-08T06:10:21Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră o matrice pătratică cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; coloane ce conţine toate numerele naturale de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N*N&amp;lt;/code&amp;gt;.  Asupra matricei se definesc trei tipuri de operaţii codificate astfel:  * &amp;lt;code&amp;gt;C i j&amp;lt;/code&amp;gt; – interschimbarea coloanelor &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; ale matricei * &amp;lt;code&amp;gt;R i j&amp;lt;/code&amp;gt; – interschimbarea liniilor &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; ale matricei * &amp;lt;code&amp;gt;E i j x y&amp;lt;/code&amp;gt; – interschimbarea...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o matrice pătratică cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; coloane ce conţine toate numerele naturale de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N*N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Asupra matricei se definesc trei tipuri de operaţii codificate astfel:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;C i j&amp;lt;/code&amp;gt; – interschimbarea coloanelor &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; ale matricei&lt;br /&gt;
* &amp;lt;code&amp;gt;R i j&amp;lt;/code&amp;gt; – interschimbarea liniilor &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; ale matricei&lt;br /&gt;
* &amp;lt;code&amp;gt;E i j x y&amp;lt;/code&amp;gt; – interschimbarea elementului de pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; cu elementul de pe linia &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Asupra matricei se efectuează un set de &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; astfel de operaţii.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se cere să se determine numărul minim de aplicări complete ale acestui set de operaţii după care se ajunge din nou în starea iniţială. În cadrul setului operaţiile se efectuează mereu în aceeaşi ordine şi nu se poate sări peste o operaţie. Deoarece numărul acesta poate fi foarte mare se cere restul împărţirii sale la &amp;lt;code&amp;gt;13007&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;perspic.in&amp;lt;/code&amp;gt; conţine pe prima linie numerele naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, separate printr-un spaţiu, reprezentând dimensiunea matricei şi respectiv numărul de operaţii dintr-un set. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se descriu operaţiile setului.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;perspic.out&amp;lt;/code&amp;gt; va conţine restul împărţirii la &amp;lt;code&amp;gt;13007&amp;lt;/code&amp;gt; al numărului minim determinat.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 10.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;60%&amp;lt;/code&amp;gt; din teste numărul minim de aplicări ale setului de operaţii necesare va fi mai mic ca &amp;lt;code&amp;gt;2.000.000.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;perspic.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2&lt;br /&gt;
 C 1 2&lt;br /&gt;
 R 1 2&lt;br /&gt;
&amp;lt;code&amp;gt;perspic.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def lcm(a, b):&lt;br /&gt;
    return a * b // gcd(a, b)&lt;br /&gt;
&lt;br /&gt;
def find_cycles(permutation):&lt;br /&gt;
    visited = [False] * len(permutation)&lt;br /&gt;
    cycles = []&lt;br /&gt;
    for i in range(len(permutation)):&lt;br /&gt;
        if not visited[i]:&lt;br /&gt;
            cycle_length = 0&lt;br /&gt;
            x = i&lt;br /&gt;
            while not visited[x]:&lt;br /&gt;
                visited[x] = True&lt;br /&gt;
                x = permutation[x]&lt;br /&gt;
                cycle_length += 1&lt;br /&gt;
            cycles.append(cycle_length)&lt;br /&gt;
    return cycles&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    import sys&lt;br /&gt;
    input = sys.stdin.read&lt;br /&gt;
    data = input().strip().split()&lt;br /&gt;
    &lt;br /&gt;
    idx = 0&lt;br /&gt;
    N = int(data[idx])&lt;br /&gt;
    idx += 1&lt;br /&gt;
    M = int(data[idx])&lt;br /&gt;
    idx += 1&lt;br /&gt;
    &lt;br /&gt;
    permutation = list(range(N * N))&lt;br /&gt;
    &lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        operation = data[idx]&lt;br /&gt;
        if operation == &#039;C&#039;:&lt;br /&gt;
            i = int(data[idx + 1]) - 1&lt;br /&gt;
            j = int(data[idx + 2]) - 1&lt;br /&gt;
            idx += 3&lt;br /&gt;
            for row in range(N):&lt;br /&gt;
                permutation[row * N + i], permutation[row * N + j] = permutation[row * N + j], permutation[row * N + i]&lt;br /&gt;
        elif operation == &#039;R&#039;:&lt;br /&gt;
            i = int(data[idx + 1]) - 1&lt;br /&gt;
            j = int(data[idx + 2]) - 1&lt;br /&gt;
            idx += 3&lt;br /&gt;
            for col in range(N):&lt;br /&gt;
                permutation[i * N + col], permutation[j * N + col] = permutation[j * N + col], permutation[i * N + col]&lt;br /&gt;
        elif operation == &#039;E&#039;:&lt;br /&gt;
            i = int(data[idx + 1]) - 1&lt;br /&gt;
            j = int(data[idx + 2]) - 1&lt;br /&gt;
            x = int(data[idx + 3]) - 1&lt;br /&gt;
            y = int(data[idx + 4]) - 1&lt;br /&gt;
            idx += 5&lt;br /&gt;
            permutation[i * N + j], permutation[x * N + y] = permutation[x * N + y], permutation[i * N + j]&lt;br /&gt;
    &lt;br /&gt;
    cycles = find_cycles(permutation)&lt;br /&gt;
    result = 1&lt;br /&gt;
    for cycle_length in cycles:&lt;br /&gt;
        result = lcm(result, cycle_length)&lt;br /&gt;
    &lt;br /&gt;
    print(result % 13007)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2475_-_Mosquito&amp;diff=10216</id>
		<title>2475 - Mosquito</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2475_-_Mosquito&amp;diff=10216"/>
		<updated>2024-08-08T06:08:32Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Supărat că fata de care-i plăcea l-a respins, Bogdan și-a făcut bagajele și a pornit într-o excursie de-a lungul întregii lumi. Acesta a vizitat mai toate continentele, însă acum este blocat în Africa din cauza faptului că Bogdan, băiat mai neastâmpărat din fire, s-a apucat să se bată cu țânțarii Mosquito.Bineînțeles că a fost înțepat și că acum trebuie să caute antidot pentru venin, altfel Bogdan se va transforma și el în Mosquito. Acesta s-a du...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Supărat că fata de care-i plăcea l-a respins, Bogdan și-a făcut bagajele și a pornit într-o excursie de-a lungul întregii lumi. Acesta a vizitat mai toate continentele, însă acum este blocat în Africa din cauza faptului că Bogdan, băiat mai neastâmpărat din fire, s-a apucat să se bată cu țânțarii Mosquito.Bineînțeles că a fost înțepat și că acum trebuie să caute antidot pentru venin, altfel Bogdan se va transforma și el în Mosquito. Acesta s-a dus să-i ceară ajutorul lui Aashiq, care îi spune următoarele: “Te voi vindeca de înțepături dacă reușești să duci la bun sfârșit sarcina pe care ți-o dau.”, însă Bogdan nu prea se pricepe la sarcini complicate, așa că vă roagă să rezolvați voi cerința în locul lui.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se trei numere naturale, &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, trebuie să aflați valoarea următoarei expresii: &amp;lt;code&amp;gt;a&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;•a&amp;lt;sup&amp;gt;k+2k&amp;lt;/sup&amp;gt;•...•a&amp;lt;sup&amp;gt;k+2k+...+nk&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Antidotul pentru înțepăturile de Mosquito necesită foarte multă muncă, motiv pentru care vor trebui îndeplinite &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; teste.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;mosquito.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, reprezentând numărul de teste.Pe următoarele &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; linii se vor afla câte trei numere &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, separate prin spații, reprezentând valorile pentru expresia cu numărul &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;. Fiind un număr foarte mare, rezultatul se va tipări modulo &amp;lt;code&amp;gt;1000000007&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;mosquito.out&amp;lt;/code&amp;gt; va conține pe linia &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; răspunsul pentru testul nu numărul de ordine &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ t ≤ 5&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a, n, k, ≤ 10&amp;lt;sup&amp;gt;9&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se garantează faptul că niciuna dintre puterile lui &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; nu va depăși &amp;lt;code&amp;gt;10&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;mosquito.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 2 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;mosquito.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1024&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;mosquito.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 3 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;mosquito.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 486784380&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 10**9 + 7&lt;br /&gt;
&lt;br /&gt;
def solve_test(a, n, k):&lt;br /&gt;
    exponent = k * (pow(2, n, MOD - 1) - 1)&lt;br /&gt;
    return pow(a, exponent, MOD)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    import sys&lt;br /&gt;
    input = sys.stdin.read&lt;br /&gt;
    data = input().strip().split()&lt;br /&gt;
    &lt;br /&gt;
    t = int(data[0])&lt;br /&gt;
    results = []&lt;br /&gt;
    index = 1&lt;br /&gt;
    &lt;br /&gt;
    for _ in range(t):&lt;br /&gt;
        a = int(data[index])&lt;br /&gt;
        n = int(data[index + 1])&lt;br /&gt;
        k = int(data[index + 2])&lt;br /&gt;
        index += 3&lt;br /&gt;
        result = solve_test(a, n, k)&lt;br /&gt;
        results.append(result)&lt;br /&gt;
    &lt;br /&gt;
    for result in results:&lt;br /&gt;
        print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1189_-_Lenes&amp;diff=10215</id>
		<title>1189 - Lenes</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1189_-_Lenes&amp;diff=10215"/>
		<updated>2024-08-04T13:24:15Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Leneşul este un animal foarte leneş. El se deplasează numai în linie dreaptă, dar face din când în când câte un popas. În această problemă leneşul trebuie să traverseze de la nord la sud şi înapoi un teren reprezentat de o matrice  de dimensiuni &amp;lt;code&amp;gt;M×N&amp;lt;/code&amp;gt; cu valori numere naturale. Valorile reprezintă efortul cerut pentru traversarea zonei respective. Leneşul va alege o coloană pentru traversarea matricei, iar pentru popasuri, în număr de &amp;lt;code&amp;gt;k1...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Leneşul este un animal foarte leneş. El se deplasează numai în linie dreaptă, dar face din când în când câte un popas. În această problemă leneşul trebuie să traverseze de la nord la sud şi înapoi un teren reprezentat de o matrice  de dimensiuni &amp;lt;code&amp;gt;M×N&amp;lt;/code&amp;gt; cu valori numere naturale. Valorile reprezintă efortul cerut pentru traversarea zonei respective. Leneşul va alege o coloană pentru traversarea matricei, iar pentru popasuri, în număr de &amp;lt;code&amp;gt;k1&amp;lt;/code&amp;gt;, va alege zone alăturate drumului din coloana din stânga sau cea din dreapta. În cazul în care se va întoarce va proceda la fel, dar va face &amp;lt;code&amp;gt;k2&amp;lt;/code&amp;gt; popasuri. Regulile problemei cer ca cele două drumuri să nu aibă zone comune.&lt;br /&gt;
&lt;br /&gt;
= Cerințe =&lt;br /&gt;
Cunoscând dimensiunile &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; ale terenului, numărul de popasuri &amp;lt;code&amp;gt;k1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k2&amp;lt;/code&amp;gt; și efortul pentru traversarea fiecărei zone a terenului, să se determine:&lt;br /&gt;
&lt;br /&gt;
# Efortul minim de parcurgere a terenului de la Nord la Sud, folosind &amp;lt;code&amp;gt;k1&amp;lt;/code&amp;gt; popasuri.&lt;br /&gt;
# Efortul minim de parcurgere a terenului de la Nord la Sud și înapoi de la Sud la Nord, folosind &amp;lt;code&amp;gt;k1&amp;lt;/code&amp;gt; popasuri la deplasarea Nord – Sud, respectiv &amp;lt;code&amp;gt;k2&amp;lt;/code&amp;gt; popasuri la deplasarea Sud – Nord.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;lenes.in&amp;lt;/code&amp;gt; conține:&lt;br /&gt;
&lt;br /&gt;
* Pe prima linie un număr natural &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; reprezentând cerința de rezolvare. Pentru toate testele de intrare numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; poate avea doar valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pe linia a doua sunt &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k2&amp;lt;/code&amp;gt;, separate prin câte un spațiu cu semnificaţia de mai sus.&lt;br /&gt;
* Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se găsesc câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale separate prin câte un spațiu, reprezentând eforturile de traversare a fiecărei zone a terenului.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, se va rezolva numai cerința 1. În acest caz fişierul &amp;lt;code&amp;gt;lenes.out&amp;lt;/code&amp;gt; va conţine un singur număr natural reprezentând efortul minim necesar pentru traversarea terenului în condiţiile date de la Nord la Sud.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, se va rezolva numai cerința 2. În acest caz fişierul &amp;lt;code&amp;gt;lenes.out&amp;lt;/code&amp;gt; va conţine un singur număr natural reprezentând efortul minim necesar pentru traversarea terenului în condiţiile date în ambele sensuri de la Nord la Sud și de la Sud la Nord.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ M, N ≤ 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ k1, k2 ≤ M&amp;lt;/code&amp;gt;&lt;br /&gt;
* Valorile din matrice sunt numere naturale din intervalul &amp;lt;code&amp;gt;[1, 1000]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Leneșul poate să facă popasuri pe aceeaşi linie în ambele celule din stânga şi din dreapta coloanei parcurse.&lt;br /&gt;
* Deplasarea între ultima zonă a drumului parcurs de la Nord la Sud şi prima zonă a drumului parcurs de la Sud la Nord la întoarcere se face cu efort &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;lenes.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 4 7 2 3&lt;br /&gt;
 99 1 33 9 2 4 7&lt;br /&gt;
 99 1 44 8 1 2 3&lt;br /&gt;
 98 1 55 8 2 3 2&lt;br /&gt;
 97 1 66 4 3 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;lenes.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&amp;lt;code&amp;gt;p = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leneșul traversează terenul de la Nord la Sud pe coloana a &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;-a cu popas în zonele &amp;lt;code&amp;gt;(2, 6)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(4, 6)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Atenție! Pentru acest test se rezolvă doar cerința 1.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;lenes.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4 7 3 2&lt;br /&gt;
 99 1 33 9 2 4 7&lt;br /&gt;
 99 1 44 8 1 2 3&lt;br /&gt;
 98 1 55 8 2 2 2&lt;br /&gt;
 97 1 66 4 3 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;lenes.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 35&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&amp;lt;code&amp;gt;p = 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leneșul traversează terenul de la Nord la Sud pe coloana a &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;-a cu popasuri în zonele &amp;lt;code&amp;gt;(3, 6)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(1, 6)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(4, 6)&amp;lt;/code&amp;gt;, iar de la Sud la Nord pe coloana a &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; – a, cu popas în zonele &amp;lt;code&amp;gt;(4, 4)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(2, 6)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Atenție! Pentru acest test se rezolvă doar cerința 2.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def min_effort_nord_sud(matrix, k1):&lt;br /&gt;
    M, N = len(matrix), len(matrix[0])&lt;br /&gt;
    inf = float(&#039;inf&#039;)&lt;br /&gt;
    &lt;br /&gt;
    # dp[c][r][p]: efort minim pentru a ajunge la (c, r) cu p popasuri rămase&lt;br /&gt;
    dp = np.full((M, N, k1 + 1), inf)&lt;br /&gt;
    &lt;br /&gt;
    # Inițializare&lt;br /&gt;
    for r in range(N):&lt;br /&gt;
        dp[0][r][k1] = matrix[0][r]&lt;br /&gt;
    &lt;br /&gt;
    for c in range(1, M):&lt;br /&gt;
        for r in range(N):&lt;br /&gt;
            for p in range(k1 + 1):&lt;br /&gt;
                # Deplasare pe coloana curentă&lt;br /&gt;
                if dp[c-1][r][p] &amp;lt; inf:&lt;br /&gt;
                    dp[c][r][p] = min(dp[c][r][p], dp[c-1][r][p] + matrix[c][r])&lt;br /&gt;
                &lt;br /&gt;
                # Popasuri (stânga/dreapta)&lt;br /&gt;
                if r &amp;gt; 0 and p &amp;gt; 0:&lt;br /&gt;
                    dp[c][r][p-1] = min(dp[c][r][p-1], dp[c-1][r-1][p] + matrix[c][r])&lt;br /&gt;
                if r &amp;lt; N - 1 and p &amp;gt; 0:&lt;br /&gt;
                    dp[c][r][p-1] = min(dp[c][r][p-1], dp[c-1][r+1][p] + matrix[c][r])&lt;br /&gt;
    &lt;br /&gt;
    return min(dp[M-1][r][0] for r in range(N))&lt;br /&gt;
&lt;br /&gt;
def min_effort_nord_sud_sud_nord(matrix, k1, k2):&lt;br /&gt;
    M, N = len(matrix), len(matrix[0])&lt;br /&gt;
    inf = float(&#039;inf&#039;)&lt;br /&gt;
    &lt;br /&gt;
    # Minim efort Nord-Sud&lt;br /&gt;
    min_effort_nord_sud_val = min_effort_nord_sud(matrix, k1)&lt;br /&gt;
    &lt;br /&gt;
    # Inversăm matricea pentru Sud-Nord&lt;br /&gt;
    matrix_reversed = matrix[::-1]&lt;br /&gt;
    &lt;br /&gt;
    # Minim efort Sud-Nord&lt;br /&gt;
    min_effort_sud_nord_val = min_effort_nord_sud(matrix_reversed, k2)&lt;br /&gt;
    &lt;br /&gt;
    return min_effort_nord_sud_val + min_effort_sud_nord_val&lt;br /&gt;
&lt;br /&gt;
# Exemple de utilizare&lt;br /&gt;
M, N = 4, 5&lt;br /&gt;
k1 = 2&lt;br /&gt;
k2 = 1&lt;br /&gt;
matrix = [&lt;br /&gt;
    [2, 4, 1, 8, 3],&lt;br /&gt;
    [6, 3, 2, 5, 1],&lt;br /&gt;
    [5, 2, 6, 7, 9],&lt;br /&gt;
    [8, 4, 2, 1, 5]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
# Efort minim pentru traversarea Nord-Sud&lt;br /&gt;
effort_nord_sud = min_effort_nord_sud(matrix, k1)&lt;br /&gt;
print(f&amp;quot;Efort minim pentru traversarea Nord-Sud: {effort_nord_sud}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Efort minim pentru traversarea Nord-Sud și Sud-Nord&lt;br /&gt;
effort_nord_sud_sud_nord = min_effort_nord_sud_sud_nord(matrix, k1, k2)&lt;br /&gt;
print(f&amp;quot;Efort minim pentru traversarea Nord-Sud și Sud-Nord: {effort_nord_sud_sud_nord}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1185_-_Cub2&amp;diff=10214</id>
		<title>1185 - Cub2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1185_-_Cub2&amp;diff=10214"/>
		<updated>2024-08-04T13:23:05Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Sărbătorile de iarnă tocmai s-au încheiat. Florinel dorește să-și ajute părinții la despodobirea bradului. Tubul luminos pe care l-au folosit anul acesta este mai special. Are &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; becuri luminoase numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, iar fiecare bec care este inscripționat cu un număr prim, va rămâne mereu aprins. Cutia în care trebuie strâns tubul este un cub de latură &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Becul cu numărul &amp;lt;code&amp;gt;1&amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sărbătorile de iarnă tocmai s-au încheiat. Florinel dorește să-și ajute părinții la despodobirea bradului. Tubul luminos pe care l-au folosit anul acesta este mai special. Are &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; becuri luminoase numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, iar fiecare bec care este inscripționat cu un număr prim, va rămâne mereu aprins. Cutia în care trebuie strâns tubul este un cub de latură &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Becul cu numărul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, trebuie pus în colțul de coordonate &amp;lt;code&amp;gt;(1,1,1)&amp;lt;/code&amp;gt;, restul în spirală până la umplerea nivelului, apoi nivelul următor în sens invers, ș.a.m.d.&lt;br /&gt;
&lt;br /&gt;
=== Exemplu – &amp;lt;code&amp;gt;N = 3&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;&#039;Nivel 1&#039;&#039;&#039;&lt;br /&gt;
 1 2 3&lt;br /&gt;
 8 9 4&lt;br /&gt;
 7 6 5&lt;br /&gt;
&#039;&#039;&#039;Nivel 2&#039;&#039;&#039;&lt;br /&gt;
 18 17 16&lt;br /&gt;
 11 10 15&lt;br /&gt;
 12 13 14&lt;br /&gt;
&#039;&#039;&#039;Nivel 3&#039;&#039;&#039;&lt;br /&gt;
 19 20 21&lt;br /&gt;
 26 27 22&lt;br /&gt;
 25 24 23&lt;br /&gt;
&#039;&#039;&#039;Fața 1 (spate)&#039;&#039;&#039;&lt;br /&gt;
 21, 20, 19,&lt;br /&gt;
 16, 17, 18,&lt;br /&gt;
  3,  2,  1&lt;br /&gt;
&#039;&#039;&#039;Fața 2 (dreapta)&#039;&#039;&#039;&lt;br /&gt;
 23, 22, 21&lt;br /&gt;
 14, 15, 16,&lt;br /&gt;
  5,  4,  3,&lt;br /&gt;
&#039;&#039;&#039;Fața 3 (frontal)&#039;&#039;&#039;&lt;br /&gt;
 25, 24, 23,&lt;br /&gt;
 12, 13, 14,&lt;br /&gt;
  7,  6,  5,&lt;br /&gt;
&#039;&#039;&#039;Fața 4 (stânga)&#039;&#039;&#039;&lt;br /&gt;
 19, 26, 25,&lt;br /&gt;
 18, 11, 12,&lt;br /&gt;
  1,  8,  7,&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând latura &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; a cubului, să se umple cubul cu tubul luminos (becurile fiind legate crescător), apoi să se determine:&lt;br /&gt;
&lt;br /&gt;
1. Coordonatele &amp;lt;code&amp;gt;(x,y,z)&amp;lt;/code&amp;gt; ale becului cu numărul &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;. (&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;-linia, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;-coloana, &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;-înălțimea)&lt;br /&gt;
&lt;br /&gt;
2. Numărul de becuri luminoase situate pe fiecare față a cubului.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;cub2.in&amp;lt;/code&amp;gt; conţine pe prima linie un număr natural &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Pentru toate testele de intrare, numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; poate avea doar valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau valoarea  &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe a doua linie a fișierului de intrare, sunt scrise două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; separate printr-un spațiu reprezentând dimensiunea cubului și valoarea becului pentru care trebuie determinate  coordonatele.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;,  se va rezolva numai cerinţa 1. În acest caz, în fişierul de ieşire &amp;lt;code&amp;gt;cub2.out&amp;lt;/code&amp;gt; se vor scrie trei numere naturale &amp;lt;code&amp;gt;x y z&amp;lt;/code&amp;gt;, separate prin câte un spațiu, reprezentând coordonatele becului cu valoarea &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, se va rezolva numai cerinţa &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. În acest caz, fişierul de ieşire &amp;lt;code&amp;gt;cub2.out&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; linii. Pe fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, se va scrie câte un număr natural &amp;lt;code&amp;gt;f&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, reprezentând numărul de becuri inscripționate cu numere prime de pe fața &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
natural &amp;lt;code&amp;gt;f&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, reprezentând numărul de becuri inscripționate cu numere prime de pe fața &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ V ≤ N&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, iar pentru cerința a doua se acordă 80 de puncte.&lt;br /&gt;
* Pentru 20% dintre teste: &amp;lt;code&amp;gt;1 ≤ N ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 30% dintre teste: &amp;lt;code&amp;gt;21 ≤ N ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 50% dintre teste: &amp;lt;code&amp;gt;101 ≤ N ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemple =&lt;br /&gt;
&amp;lt;code&amp;gt;cub2.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 3 10&lt;br /&gt;
&amp;lt;code&amp;gt;cub2.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 2&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&#039;&#039;&#039;Atenție! Pentru acest test se rezolvă doar cerința 1).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
linia &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, coloana &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, nivel &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; – este becul &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cub2.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 3 10&lt;br /&gt;
&amp;lt;code&amp;gt;cub2.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 3&lt;br /&gt;
 4&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&#039;&#039;&#039;Atenție! Pentru acest test se rezolvă doar cerința 2).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; – becuri inscripționate cu numere prime pe fața 1: &amp;lt;code&amp;gt;2, 3, 17, 19&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; – becuri inscripționate cu numere prime pe fața 2: &amp;lt;code&amp;gt;3, 5, 23&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; – becuri inscripționate cu numere prime pe fața 3: &amp;lt;code&amp;gt;5, 7, 13, 23&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; – becuri inscripționate cu numere prime pe fața 4: &amp;lt;code&amp;gt;7, 11, 19&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def generate_spiral_layer(n, start_val):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; Generate a spiral layer of size n x n starting from start_val &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    layer = [[0] * n for _ in range(n)]&lt;br /&gt;
    num = start_val&lt;br /&gt;
    for layer_idx in range((n + 1) // 2):&lt;br /&gt;
        for i in range(layer_idx, n - layer_idx):&lt;br /&gt;
            layer[layer_idx][i] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
        for i in range(layer_idx + 1, n - layer_idx):&lt;br /&gt;
            layer[i][n - layer_idx - 1] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
        for i in range(n - layer_idx - 2, layer_idx - 1, -1):&lt;br /&gt;
            layer[n - layer_idx - 1][i] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
        for i in range(n - layer_idx - 2, layer_idx, -1):&lt;br /&gt;
            layer[i][layer_idx] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
    return layer&lt;br /&gt;
&lt;br /&gt;
def generate_cube(N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; Generate a cube of size N x N x N filled in spiral order &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    cube = [[[0] * N for _ in range(N)] for _ in range(N)]&lt;br /&gt;
    num = 1&lt;br /&gt;
    for z in range(N):&lt;br /&gt;
        layer = generate_spiral_layer(N, num)&lt;br /&gt;
        for y in range(N):&lt;br /&gt;
            for x in range(N):&lt;br /&gt;
                cube[z][y][x] = layer[y][x]&lt;br /&gt;
        num += N * N&lt;br /&gt;
    return cube&lt;br /&gt;
&lt;br /&gt;
def find_coordinates(cube, V):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; Find coordinates (x, y, z) of the value V in the cube &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(cube)&lt;br /&gt;
    for z in range(N):&lt;br /&gt;
        for y in range(N):&lt;br /&gt;
            for x in range(N):&lt;br /&gt;
                if cube[z][y][x] == V:&lt;br /&gt;
                    return (x + 1, y + 1, z + 1)&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def count_lights_on_faces(cube):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; Count the number of lights on each face of the cube &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(cube)&lt;br /&gt;
    counts = {&#039;front&#039;: 0, &#039;back&#039;: 0, &#039;left&#039;: 0, &#039;right&#039;: 0, &#039;top&#039;: 0, &#039;bottom&#039;: 0}&lt;br /&gt;
    &lt;br /&gt;
    # Counting lights on each face&lt;br /&gt;
    for z in range(N):&lt;br /&gt;
        counts[&#039;top&#039;] += N&lt;br /&gt;
        counts[&#039;bottom&#039;] += N&lt;br /&gt;
    &lt;br /&gt;
    for y in range(N):&lt;br /&gt;
        counts[&#039;front&#039;] += N&lt;br /&gt;
        counts[&#039;back&#039;] += N&lt;br /&gt;
    &lt;br /&gt;
    for x in range(N):&lt;br /&gt;
        counts[&#039;left&#039;] += N&lt;br /&gt;
        counts[&#039;right&#039;] += N&lt;br /&gt;
    &lt;br /&gt;
    return counts&lt;br /&gt;
&lt;br /&gt;
# Example Usage&lt;br /&gt;
N = 3&lt;br /&gt;
V = 7  # Example value to find coordinates for&lt;br /&gt;
cube = generate_cube(N)&lt;br /&gt;
&lt;br /&gt;
coordinates = find_coordinates(cube, V)&lt;br /&gt;
face_counts = count_lights_on_faces(cube)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Coordinates of the light with number {V}: {coordinates}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Number of lights on each face: {face_counts}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2588_-_Iepuras1&amp;diff=10213</id>
		<title>2588 - Iepuras1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2588_-_Iepuras1&amp;diff=10213"/>
		<updated>2024-08-04T13:21:40Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Un iepuraş se găseşte într-o grădină plină de surprize. Harta grădinii poate fi reprezentată sub forma unei table dreptunghiulare cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; de sus în jos, şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de la stânga la dreapta. În fiecare celulă a acestei grădini se poate găsi cel mult una dintre următoarele surprize: săgeată, pom, zid, trapă, morcov, bombă.  O s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un iepuraş se găseşte într-o grădină plină de surprize. Harta grădinii poate fi reprezentată sub forma unei table dreptunghiulare cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; de sus în jos, şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de la stânga la dreapta. În fiecare celulă a acestei grădini se poate găsi cel mult una dintre următoarele surprize: săgeată, pom, zid, trapă, morcov, bombă.&lt;br /&gt;
&lt;br /&gt;
O săgeată indică una din direcţiile nord, sud, est, vest. Odată ajuns într-o celulă conţinând o astfel de săgeată iepuraşul îşi va continua deplasarea în sensul indicat de săgeată, iar aceasta dispare.&lt;br /&gt;
&lt;br /&gt;
Într-o celulă în care se găseşte un pom sau un zid iepuraşul nu poate să pătrundă, însă dacă se “loveşte” de un pom, el îşi păstrează direcţia, însă schimbă sensul (dacă se deplasa spre nord, îşi va schimba sensul spre sud, dacă se deplasa spre est, se va deplasa după aceea spre vest etc).&lt;br /&gt;
&lt;br /&gt;
Dacă iepuraşul intră într-o celulă conţinând o trapă, toate zidurile aflate pe teren dispar şi vor apărea alte ziduri, în poziţii precizate. Dacă iepuraşul va trece din nou printr-o celulă conţinând o trapă, zidurile nou construite dispar şi vor reapărea zidurile iniţiale. Mai exact există două grupe de ziduri care comută la fiecare trecere printr-o celulă care conţine o trapă.&lt;br /&gt;
&lt;br /&gt;
Dacă iepuraşul va trece de două ori prin vecinătatea unei celule conţinând o bombă (adică prin celulele învecinate la sud, nord, est sau vest cu celula conţinând bombă), bomba va exploda iar iepuraşul se transformă instantaneu în îngeraş. De asemenea, dacă iepuraşul întră într-o celulă conţinând o bombă se transformă instantaneu în îngeraș.&lt;br /&gt;
&lt;br /&gt;
Iepuraşul va ronţăi toţi morcovii care îi ies în cale. Evident că dacă trece a doua oară prin aceeaşi celulă, la a doua trecere nu va mai găsi morcov.&lt;br /&gt;
&lt;br /&gt;
Surprizele din grădină sunt codificate astfel: &#039;&#039;&#039;1&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;săgeată spre nord&amp;lt;/code&amp;gt;, &#039;&#039;&#039;2&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;săgeată spre vest&amp;lt;/code&amp;gt;, &#039;&#039;&#039;3&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;săgeată spre sud&amp;lt;/code&amp;gt;, &#039;&#039;&#039;4&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;săgeată spre est&amp;lt;/code&amp;gt;, &#039;&#039;&#039;5&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;pom&amp;lt;/code&amp;gt;, &#039;&#039;&#039;6&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;bombă&amp;lt;/code&amp;gt;, &#039;&#039;&#039;7&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;morcov&amp;lt;/code&amp;gt;, &#039;&#039;&#039;8&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;zid&amp;lt;/code&amp;gt;, &#039;&#039;&#039;9&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;trapă&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;Căsuţele libere&amp;lt;/code&amp;gt; de pe harta grădinii se codifică cu &#039;&#039;&#039;0&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Iniţial, se cunosc poziţia şi sensul de deplasare ale iepuraşului.  Expediţia acestuia se termină în următoarele situaţii:&lt;br /&gt;
&lt;br /&gt;
* la explozia unei bombe, caz in care se transforma in ingeras;&lt;br /&gt;
* la parasirea gradinii (adica la iesirea in afara zonei dreptunghiulare date), caz in care se rataceste;&lt;br /&gt;
* in momentul in care reuseste sa rontaie toti morcovii, caz in care este fericit.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind data harta grădinii se cere să se determine starea finală a iepuraşului (îngeraş, rătăcit respectiv fericit), numărul de morcovi ronţăiţi până în momentul terminării expediţiei, precum şi numărul de paşi pe care îi face iepuraşul până la acest moment.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fişierului de intrare &amp;lt;code&amp;gt;iepuras1.in&amp;lt;/code&amp;gt; se găsesc două numere întregi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, separate printr-un spaţiu, reprezentând numărul de linii, respectiv numărul de coloane ale hărţii.&lt;br /&gt;
&lt;br /&gt;
Linia a doua a fişierului conţine trei numere naturale, separate prin câte un spaţiu, reprezentând linia si coloana poziţiei iniţiale a iepuraşului pe hartă precum şi direcţia spre care acesta este orientat. Direcţia este codificată astfel: &#039;&#039;&#039;1&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;nord&amp;lt;/code&amp;gt;, &#039;&#039;&#039;2&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;vest&amp;lt;/code&amp;gt;, &#039;&#039;&#039;3&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;sud&amp;lt;/code&amp;gt;, &#039;&#039;&#039;4&#039;&#039;&#039; pentru &amp;lt;code&amp;gt;est&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarele m linii conţin câte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere întregi separate prin câte un spaţiu, reprezentând codificarea hărţii grădinii, conform celor precizate mai sus.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conţine un singur număr natural &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; reprezentând numărul de celule ce vor conţine ziduri după prima trecere printr-o celulă conţinând o trapă. Următoarele &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; linii conţin câte două numere naturale &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, separate printr-un spaţiu, reprezentând coordonatele câte unei celule ce va conţine zid după o primă trecere printr-o celulă conţinând o trapă.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;iepuras1.out&amp;lt;/code&amp;gt; va conţine pe prima sa linie unul dintre cuvintele &amp;lt;code&amp;gt;INGERAS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RATACIT&amp;lt;/code&amp;gt; respectiv &amp;lt;code&amp;gt;FERICIT&amp;lt;/code&amp;gt;, corespunzător stării finale a iepuraşului. A doua linie a fişierului va conţine două numere întregi separate printr-un spaţiu, reprezentând linia şi coloana ultimei poziţii de pe teren a iepuraşului, adică poziţia în care a murit, sau în care a devenit fericit, respectiv ultima poziţie a sa de pe teren, înainte de a se rătăci.&lt;br /&gt;
&lt;br /&gt;
A treia linie a fişierului va conţine două numere întregi separate printr-un spaţiu, reprezentând numărul de morcovi culeşi până în momentul terminării expediţiei, respectiv numărul de paşi pe care îi face iepuraşul până ajunge în starea finală.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* poziţia iniţială a iepuraşului este una validă, adică este o celulă liberă din interiorul terenului;&lt;br /&gt;
* pentru datele de test, se asigură că iepuraşul va face un număr finit de paşi până la terminarea expediţiei sale;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m, n ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ t ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* numărul maxim de ziduri aflate la un moment dat pe teren este de cel mult 50, şi este posibil ca la un moment dat să nu existe niciun zid pe teren.&lt;br /&gt;
* Se garantează că pentru datele de intrare iepuraşul nu poate ajunge simultan în două din cele trei stări.&lt;br /&gt;
* Pomii şi trapele sunt obiecte care rămân permanent în teren, în poziţiile lor iniţiale.&lt;br /&gt;
* Într-o celulă a grădinii se poate găsi la un moment dat o singură surpriză (&amp;lt;code&amp;gt;pom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;zid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;trapă&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;morcov&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;săgeată&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bombă&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Exemplu1: =&lt;br /&gt;
&amp;lt;code&amp;gt;iepuras1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 15&lt;br /&gt;
 7 1 4&lt;br /&gt;
 0 0 6 0 5 5 0 7 0 0 0 0 0 0 0&lt;br /&gt;
 0 0 0 0 5 5 0 0 4 0 0 0 0 0 3&lt;br /&gt;
 0 5 5 0 5 5 0 0 0 0 0 0 0 0 0 &lt;br /&gt;
 0 5 5 0 5 5 0 1 7 0 0 7 0 0 2&lt;br /&gt;
 0 0 0 0 5 5 0 0 0 0 0 0 0 0 0&lt;br /&gt;
 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0&lt;br /&gt;
 0 3 0 0 0 5 6 0 0 5 5 5 0 0 0&lt;br /&gt;
 0 7 0 0 0 0 0 0 0 0 0 0 0 5 0&lt;br /&gt;
 0 4 0 0 0 7 0 0 3 5 0 0 0 5 0&lt;br /&gt;
 0 6 0 0 0 0 0 0 1 5 0 0 0 5 0&lt;br /&gt;
 0 &lt;br /&gt;
&amp;lt;code&amp;gt;iepuras1.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 FERICIT&lt;br /&gt;
 1 8&lt;br /&gt;
 5 37&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def simulare_gradina(m, n, gradina, poz_initiala, directie_initiala):&lt;br /&gt;
    # Direcțiile de mișcare: nord, vest, sud, est&lt;br /&gt;
    directii = {&lt;br /&gt;
        &#039;nord&#039;: (-1, 0),&lt;br /&gt;
        &#039;vest&#039;: (0, -1),&lt;br /&gt;
        &#039;sud&#039;: (1, 0),&lt;br /&gt;
        &#039;est&#039;: (0, 1)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    # Mapare coduri săgeți la direcții&lt;br /&gt;
    sageata_la_directie = {&lt;br /&gt;
        1: &#039;nord&#039;,&lt;br /&gt;
        2: &#039;vest&#039;,&lt;br /&gt;
        3: &#039;sud&#039;,&lt;br /&gt;
        4: &#039;est&#039;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    # Poziția curentă și direcția curentă&lt;br /&gt;
    x, y = poz_initiala&lt;br /&gt;
    directie = directie_initiala&lt;br /&gt;
    &lt;br /&gt;
    # Contoare&lt;br /&gt;
    morcovi_ronțăiți = 0&lt;br /&gt;
    pasi = 0&lt;br /&gt;
    treceri_pe_langa_bombe = {}&lt;br /&gt;
    starea_finala = &#039;rătăcit&#039;  # implicit&lt;br /&gt;
    &lt;br /&gt;
    # Funcție pentru verificarea granițelor&lt;br /&gt;
    def in_gradina(x, y):&lt;br /&gt;
        return 0 &amp;lt;= x &amp;lt; m and 0 &amp;lt;= y &amp;lt; n&lt;br /&gt;
    &lt;br /&gt;
    # Pozițiile inițiale ale zidurilor&lt;br /&gt;
    ziduri_initiale = set()&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if gradina[i][j] == 8:&lt;br /&gt;
                ziduri_initiale.add((i, j))&lt;br /&gt;
    &lt;br /&gt;
    # Pozițiile zidurilor alternative&lt;br /&gt;
    ziduri_alternative = set()&lt;br /&gt;
    &lt;br /&gt;
    # Inițial, zidurile sunt cele inițiale&lt;br /&gt;
    ziduri_curente = ziduri_initiale.copy()&lt;br /&gt;
    &lt;br /&gt;
    # Traseul iepurașului&lt;br /&gt;
    while True:&lt;br /&gt;
        if not in_gradina(x, y):&lt;br /&gt;
            starea_finala = &#039;rătăcit&#039;&lt;br /&gt;
            break&lt;br /&gt;
        &lt;br /&gt;
        pasi += 1&lt;br /&gt;
        celula = gradina[x][y]&lt;br /&gt;
        &lt;br /&gt;
        if celula == 7:  # morcov&lt;br /&gt;
            morcovi_ronțăiți += 1&lt;br /&gt;
            gradina[x][y] = 0&lt;br /&gt;
        &lt;br /&gt;
        elif celula in sageata_la_directie:  # săgeată&lt;br /&gt;
            directie = sageata_la_directie[celula]&lt;br /&gt;
            gradina[x][y] = 0&lt;br /&gt;
        &lt;br /&gt;
        elif celula == 5:  # pom&lt;br /&gt;
            dx, dy = directii[directie]&lt;br /&gt;
            x -= dx&lt;br /&gt;
            y -= dy&lt;br /&gt;
            directie = {&#039;nord&#039;: &#039;sud&#039;, &#039;sud&#039;: &#039;nord&#039;, &#039;vest&#039;: &#039;est&#039;, &#039;est&#039;: &#039;vest&#039;}[directie]&lt;br /&gt;
        &lt;br /&gt;
        elif celula == 6:  # bombă&lt;br /&gt;
            starea_finala = &#039;îngeraș&#039;&lt;br /&gt;
            break&lt;br /&gt;
        &lt;br /&gt;
        elif celula == 9:  # trapă&lt;br /&gt;
            ziduri_curente = ziduri_alternative if ziduri_curente == ziduri_initiale else ziduri_initiale&lt;br /&gt;
        &lt;br /&gt;
        # Verificăm dacă trece pe lângă o bombă&lt;br /&gt;
        vecini = [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]&lt;br /&gt;
        for vx, vy in vecini:&lt;br /&gt;
            if in_gradina(vx, vy) and gradina[vx][vy] == 6:&lt;br /&gt;
                if (vx, vy) not in treceri_pe_langa_bombe:&lt;br /&gt;
                    treceri_pe_langa_bombe[(vx, vy)] = 0&lt;br /&gt;
                treceri_pe_langa_bombe[(vx, vy)] += 1&lt;br /&gt;
                if treceri_pe_langa_bombe[(vx, vy)] == 2:&lt;br /&gt;
                    starea_finala = &#039;îngeraș&#039;&lt;br /&gt;
                    return starea_finala, morcovi_ronțăiți, pasi&lt;br /&gt;
        &lt;br /&gt;
        # Deplasarea iepurașului&lt;br /&gt;
        dx, dy = directii[directie]&lt;br /&gt;
        x += dx&lt;br /&gt;
        y += dy&lt;br /&gt;
        &lt;br /&gt;
        # Verificăm dacă toate morcovii au fost mâncați&lt;br /&gt;
        if all(all(cell != 7 for cell in row) for row in gradina):&lt;br /&gt;
            starea_finala = &#039;fericit&#039;&lt;br /&gt;
            break&lt;br /&gt;
    &lt;br /&gt;
    return starea_finala, morcovi_ronțăiți, pasi&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
m = 4&lt;br /&gt;
n = 4&lt;br /&gt;
gradina = [&lt;br /&gt;
    [0, 7, 0, 0],&lt;br /&gt;
    [2, 5, 3, 0],&lt;br /&gt;
    [0, 6, 0, 7],&lt;br /&gt;
    [0, 0, 0, 0]&lt;br /&gt;
]&lt;br /&gt;
poz_initiala = (0, 0)&lt;br /&gt;
directie_initiala = &#039;est&#039;&lt;br /&gt;
&lt;br /&gt;
rezultat = simulare_gradina(m, n, gradina, poz_initiala, directie_initiala)&lt;br /&gt;
print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1421_-_tabel&amp;diff=10212</id>
		<title>1421 - tabel</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1421_-_tabel&amp;diff=10212"/>
		<updated>2024-08-04T13:20:05Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: = Enunț = După cum probabil ştiţi, contabilii îşi ţin datele sub formă de tabele şi calculează tot felul de sume pe linii şi pe coloane. Contabilul nostru Atnoc şi-a organizat valorile sub forma unui tabel cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;) şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;). Elementele de pe ultima coloană sunt sumele elementelor de pe linii (mai exact, elementul de pe linia &amp;lt;co...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Enunț =&lt;br /&gt;
După cum probabil ştiţi, contabilii îşi ţin datele sub formă de tabele şi calculează tot felul de sume pe linii şi pe coloane. Contabilul nostru Atnoc şi-a organizat valorile sub forma unui tabel cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;) şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane (numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;). Elementele de pe ultima coloană sunt sumele elementelor de pe linii (mai exact, elementul de pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; este egal cu suma elementelor de pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; aflate pe coloanele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;m-1&amp;lt;/code&amp;gt;), iar elementele de pe ultima linie sunt sumele elementelor de pe coloane (mai exact, elementul de pe linia &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; este egal cu suma elementelor de pe coloana &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; aflate pe liniile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt;). Un exemplu de astfel de tabel este dat în figura următoare.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;14&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;13&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;13&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Din păcate, Atnoc a stropit cu apă minunatul său tabel şi astfel o parte dintre numerele din tabel au devenit ilizibile.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care să reconstituie toate datele din tabel.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fişierului text de intrare &amp;lt;code&amp;gt;tabel.in&amp;lt;/code&amp;gt; se află două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, separate printr-un spaţiu, ce reprezintă numărul de linii şi respectiv numărul de coloane ale tabelului. Pe cea de a doua linie a fişierului de intrare se află un număr natural &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; care reprezintă numărul de valori nedeteriorate din tabel. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; linii se află câte trei numere naturale, separate prin câte un spaţiu &amp;lt;code&amp;gt;l c v&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; este numărul liniei, &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; este numărul coloanei şi &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; este valoarea elementului de pe linia &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; din tabel.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fişierul text de ieşire &amp;lt;code&amp;gt;tabel.out&amp;lt;/code&amp;gt; se va scrie tabelul reconstituit, pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; valori separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;n, m&amp;lt;51&amp;lt;/code&amp;gt;&lt;br /&gt;
* Valorile din tabel sunt numere naturale &amp;lt;code&amp;gt;&amp;lt; 32000&amp;lt;/code&amp;gt;&lt;br /&gt;
* În toate testele datele din tabel pot fi reconstituite.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;tabel.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 4&lt;br /&gt;
 10&lt;br /&gt;
 1 1 2&lt;br /&gt;
 1 2 5&lt;br /&gt;
 1 3 7&lt;br /&gt;
 1 4 14&lt;br /&gt;
 2 2 6&lt;br /&gt;
 2 4 23&lt;br /&gt;
 3 1 13&lt;br /&gt;
 3 2 11&lt;br /&gt;
 3 3 13&lt;br /&gt;
 3 4 37&lt;br /&gt;
&amp;lt;code&amp;gt;tabel.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 5 7 14&lt;br /&gt;
 11 6 6 23&lt;br /&gt;
 13 11 13 37&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def reconstruct_table(table):&lt;br /&gt;
    n = len(table)        # numărul de linii&lt;br /&gt;
    m = len(table[0])     # numărul de coloane&lt;br /&gt;
    &lt;br /&gt;
    # Functie pentru a calcula suma unei linii&lt;br /&gt;
    def calculate_row_sum(row):&lt;br /&gt;
        return sum(x for x in row if x is not None)&lt;br /&gt;
    &lt;br /&gt;
    # Functie pentru a calcula suma unei coloane&lt;br /&gt;
    def calculate_col_sum(table, col):&lt;br /&gt;
        return sum(table[i][col] for i in range(n-1) if table[i][col] is not None)&lt;br /&gt;
    &lt;br /&gt;
    # Pasul 1: Completarea liniilor folosind suma liniei&lt;br /&gt;
    for i in range(n-1):&lt;br /&gt;
        row_sum = table[i][m-1]&lt;br /&gt;
        current_sum = calculate_row_sum(table[i])&lt;br /&gt;
        missing_count = table[i][:m-1].count(None)&lt;br /&gt;
        if missing_count == 1:&lt;br /&gt;
            for j in range(m-1):&lt;br /&gt;
                if table[i][j] is None:&lt;br /&gt;
                    table[i][j] = row_sum - current_sum&lt;br /&gt;
    &lt;br /&gt;
    # Pasul 2: Completarea coloanelor folosind suma coloanei&lt;br /&gt;
    for j in range(m-1):&lt;br /&gt;
        col_sum = table[n-1][j]&lt;br /&gt;
        current_sum = calculate_col_sum(table, j)&lt;br /&gt;
        missing_count = sum(1 for i in range(n-1) if table[i][j] is None)&lt;br /&gt;
        if missing_count == 1:&lt;br /&gt;
            for i in range(n-1):&lt;br /&gt;
                if table[i][j] is None:&lt;br /&gt;
                    table[i][j] = col_sum - current_sum&lt;br /&gt;
    &lt;br /&gt;
    # Pasul 3: Calcularea sumei pe ultima linie și ultima coloană&lt;br /&gt;
    for i in range(n-1):&lt;br /&gt;
        table[i][m-1] = calculate_row_sum(table[i])&lt;br /&gt;
    &lt;br /&gt;
    for j in range(m-1):&lt;br /&gt;
        table[n-1][j] = calculate_col_sum(table, j)&lt;br /&gt;
    &lt;br /&gt;
    # Calcularea colțului de jos-dreapta&lt;br /&gt;
    table[n-1][m-1] = sum(table[n-1][j] for j in range(m-1))&lt;br /&gt;
    &lt;br /&gt;
    return table&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare:&lt;br /&gt;
table = [&lt;br /&gt;
    [2, 5, 7, 14],&lt;br /&gt;
    [11, None, 6, 23],&lt;br /&gt;
    [None, 11, 13, 37]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
reconstructed_table = reconstruct_table(table)&lt;br /&gt;
for row in reconstructed_table:&lt;br /&gt;
    print(row)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2461_-_V&amp;diff=10211</id>
		<title>2461 - V</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2461_-_V&amp;diff=10211"/>
		<updated>2024-08-04T13:18:06Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră un tablou bidimensional cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane. Se numeşte traseu în &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; o parcurgere prin elementele tabloului astfel:  * se pleacă întotdeauna dintr-un element de pe prima linie a tabloului, se ajunge în final într-un alt element de pe prima linie a tabloului, trecând prin cel puţin 3 elemente, fără a trece printr-un element de mai multe ori; * parcurgerea elementelor tabloului se face în forma unei singure lit...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră un tablou bidimensional cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane. Se numeşte traseu în &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; o parcurgere prin elementele tabloului astfel:&lt;br /&gt;
&lt;br /&gt;
* se pleacă întotdeauna dintr-un element de pe prima linie a tabloului, se ajunge în final într-un alt element de pe prima linie a tabloului, trecând prin cel puţin 3 elemente, fără a trece printr-un element de mai multe ori;&lt;br /&gt;
* parcurgerea elementelor tabloului se face în forma unei singure litere &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; ca în desen, dintr-un element putându-se trece doar într-un alt element imediat vecin pe diagonală.&lt;br /&gt;
&lt;br /&gt;
Fiecare element al tabloului conţine valori întregi. La parcurgerea traseului se calculează suma elementelor de pe traseu.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinaţi traseul în &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; care are suma maximă. În cazul în care există mai multe trasee de sumă maximă, se va alege traseul care parcurge cele mai puţine elemente. Dacă şi în acest caz există mai multe soluţii, se alege traseul cel mai din stânga (cel cu indicele coloanei de pornire cel mai mic).&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Din fişierul de intrare &amp;lt;code&amp;gt;v.in&amp;lt;/code&amp;gt; se citesc de pe prima linie valorile naturale &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, separate printr-un spaţiu, reprezentând numărul de linii şi numărul de coloane ale tabloului. Pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se află câte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori întregi separate prin spaţii, reprezentând elementele tabloului.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;v.out&amp;lt;/code&amp;gt; va conţine o singură linie pe care vor fi scrise trei valori naturale &amp;lt;code&amp;gt;S C L&amp;lt;/code&amp;gt;, reprezentând suma maximă, coloana de pornire şi respectiv linia pe care se află vârful &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;-ului traseului determinat.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m, n ≤ 1500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-60000 ≤&amp;lt;/code&amp;gt; valorile elementelor tabloului &amp;lt;code&amp;gt;≤ 60000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru datele de test suma valorilor din elementele oricărui traseu va fi între &amp;lt;code&amp;gt;-2 000 000 000&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;2 000 000 000&amp;lt;/code&amp;gt; .&lt;br /&gt;
* Pentru 50% din teste &amp;lt;code&amp;gt;1 ≤ m, n ≤ 101&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 70% din teste &amp;lt;code&amp;gt;1 ≤ m, n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nota: Această problemă conține restricții și teste îmbunătățite&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&#039;&#039;&#039;v.in&#039;&#039;&#039;&lt;br /&gt;
 5 9&lt;br /&gt;
 3 4 12 4 6 7 9 5 12&lt;br /&gt;
 0 4 5 7 9 -5 1 1 5&lt;br /&gt;
 0 98 34 0 1 7 7 1 1&lt;br /&gt;
 6 7 8 -9 0 2 3 5 22&lt;br /&gt;
 47 62 31 55 0 83 23 77 10&lt;br /&gt;
&#039;&#039;&#039;v.out&#039;&#039;&#039;&lt;br /&gt;
 54 1 3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def find_best_v_path(matrix):&lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    # Step 3: Calculate dp_down&lt;br /&gt;
    dp_down = [[float(&#039;-inf&#039;)] * n for _ in range(m)]&lt;br /&gt;
    dp_down[0] = matrix[0][:]&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, m):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if j &amp;gt; 0:&lt;br /&gt;
                dp_down[i][j] = max(dp_down[i][j], dp_down[i-1][j-1] + matrix[i][j])&lt;br /&gt;
            if j &amp;lt; n - 1:&lt;br /&gt;
                dp_down[i][j] = max(dp_down[i][j], dp_down[i-1][j+1] + matrix[i][j])&lt;br /&gt;
    &lt;br /&gt;
    # Step 4: Calculate dp_up&lt;br /&gt;
    dp_up = [[float(&#039;-inf&#039;)] * n for _ in range(m)]&lt;br /&gt;
    dp_up[m-1] = matrix[m-1][:]&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m-2, -1, -1):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if j &amp;gt; 0:&lt;br /&gt;
                dp_up[i][j] = max(dp_up[i][j], dp_up[i+1][j-1] + matrix[i][j])&lt;br /&gt;
            if j &amp;lt; n - 1:&lt;br /&gt;
                dp_up[i][j] = max(dp_up[i][j], dp_up[i+1][j+1] + matrix[i][j])&lt;br /&gt;
    &lt;br /&gt;
    # Step 5: Find the maximum sum path&lt;br /&gt;
    max_sum = float(&#039;-inf&#039;)&lt;br /&gt;
    min_length = float(&#039;inf&#039;)&lt;br /&gt;
    best_path_start = -1&lt;br /&gt;
    best_path_end = -1&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if dp_down[i][j] == float(&#039;-inf&#039;) or dp_up[i][j] == float(&#039;-inf&#039;):&lt;br /&gt;
                continue&lt;br /&gt;
            total_sum = dp_down[i][j] + dp_up[i][j] - matrix[i][j]&lt;br /&gt;
            length = 2 * i + 1&lt;br /&gt;
            if total_sum &amp;gt; max_sum or (total_sum == max_sum and length &amp;lt; min_length):&lt;br /&gt;
                max_sum = total_sum&lt;br /&gt;
                min_length = length&lt;br /&gt;
                best_path_start = j&lt;br /&gt;
                best_path_end = j&lt;br /&gt;
    &lt;br /&gt;
    return max_sum, best_path_start, best_path_end&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare:&lt;br /&gt;
matrix = [&lt;br /&gt;
    [3, 1, 7],&lt;br /&gt;
    [2, 5, 4],&lt;br /&gt;
    [1, 6, 2]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
result = find_best_v_path(matrix)&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2425_-_Peri&amp;diff=10210</id>
		<title>2425 - Peri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2425_-_Peri&amp;diff=10210"/>
		<updated>2024-07-31T12:56:09Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o matrice dreptunghiulară &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane cu valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, liniile şi coloanele fiind numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, respectiv de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Numim dreptunghi de colţuri &amp;lt;code&amp;gt;(x1, y1) (x2,y2)&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;x1 &amp;lt; x2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y1 &amp;lt; y2&amp;lt;/code&amp;gt; mulţimea elementelor &amp;lt;code&amp;gt;A[i][j]&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;x1 ≤ i ≤ x2&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;y1 ≤ j ≤ y2&amp;lt;/code&amp;gt;. Numim perimetru al dreptunghiului de colţuri &amp;lt;code&amp;gt;(x1, y1) (x2, y2)&amp;lt;/code&amp;gt; mulţimea elementelor &amp;lt;code&amp;gt;A[i][j]&amp;lt;/code&amp;gt; pentru care (&amp;lt;code&amp;gt;i = x1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y1 ≤ j ≤ y2&amp;lt;/code&amp;gt;) sau (&amp;lt;code&amp;gt;i = x2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y1 ≤ j ≤ y2&amp;lt;/code&amp;gt;) sau (&amp;lt;code&amp;gt;j = y1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;x1 ≤ i ≤ x2&amp;lt;/code&amp;gt;) sau (&amp;lt;code&amp;gt;j = y2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;x1 ≤ i ≤ x2&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinaţi diferenţa maximă dintre numărul de elemente egale cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi numărul de elemente egale cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; aflate pe perimetrul aceluiaşi dreptunghi, precum şi numărul de dreptunghiuri pentru care se obţine această diferenţă.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;peri.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, separate printr-un singur spaţiu. Pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii este dată matricea &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, numerele de pe aceeaşi linie fiind separate de câte un spaţiu.&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;peri.out&amp;lt;/code&amp;gt; va conţine o singură linie pe care se află două numere întregi separate printr-un spaţiu. Primul număr este diferenţa maximă dintre numărul de elemente &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi numărul de elemente &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; de pe perimetrul unui dreptunghi. Al doilea întreg este numărul de dreptunghiuri pentru care diferenţa dintre numărul de elemente &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi numărul de elemente &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; de pe perimetru este maximă.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m, n ≤ 250&amp;lt;/code&amp;gt;&lt;br /&gt;
* Prin diferenţă nu se înţelege diferenţă în valoare absolută!&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;peri.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 5&lt;br /&gt;
 1 0 0 1 0 &lt;br /&gt;
 0 1 1 0 0 &lt;br /&gt;
 0 1 0 1 0 &lt;br /&gt;
 1 1 1 0 1&lt;br /&gt;
&amp;lt;code&amp;gt;peri.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def max_perimeter_diff(matrix):&lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    max_diff = float(&#039;-inf&#039;)&lt;br /&gt;
    count_max_diff_rects = 0&lt;br /&gt;
&lt;br /&gt;
    # Helper function to count 1&#039;s and 0&#039;s on the perimeter&lt;br /&gt;
    def count_perimeter(x1, y1, x2, y2):&lt;br /&gt;
        ones = 0&lt;br /&gt;
        zeros = 0&lt;br /&gt;
        for j in range(y1, y2 + 1):&lt;br /&gt;
            if matrix[x1][j] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
            if matrix[x2][j] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
        for i in range(x1 + 1, x2):&lt;br /&gt;
            if matrix[i][y1] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
            if matrix[i][y2] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
        return ones, zeros&lt;br /&gt;
&lt;br /&gt;
    # Iterate over all possible top-left corners (x1, y1)&lt;br /&gt;
    for x1 in range(m - 1):&lt;br /&gt;
        for y1 in range(n - 1):&lt;br /&gt;
            # Iterate over all possible bottom-right corners (x2, y2)&lt;br /&gt;
            for x2 in range(x1 + 1, m):&lt;br /&gt;
                for y2 in range(y1 + 1, n):&lt;br /&gt;
                    ones, zeros = count_perimeter(x1, y1, x2, y2)&lt;br /&gt;
                    diff = ones - zeros&lt;br /&gt;
                    if diff &amp;gt; max_diff:&lt;br /&gt;
                        max_diff = diff&lt;br /&gt;
                        count_max_diff_rects = 1&lt;br /&gt;
                    elif diff == max_diff:&lt;br /&gt;
                        count_max_diff_rects += 1&lt;br /&gt;
&lt;br /&gt;
    return max_diff, count_max_diff_rects&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
matrix = [&lt;br /&gt;
    [0, 1, 0, 1],&lt;br /&gt;
    [1, 0, 1, 0],&lt;br /&gt;
    [0, 1, 0, 1],&lt;br /&gt;
    [1, 0, 1, 0]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
max_diff, count_max_diff_rects = max_perimeter_diff(matrix)&lt;br /&gt;
print(f&amp;quot;Diferența maximă: {max_diff}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul de dreptunghiuri: {count_max_diff_rects}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2425_-_Peri&amp;diff=10209</id>
		<title>2425 - Peri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2425_-_Peri&amp;diff=10209"/>
		<updated>2024-07-31T12:55:23Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră o matrice dreptunghiulară &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane cu valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, liniile şi coloanele fiind numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, respectiv de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Numim dreptunghi de colţuri &amp;lt;code&amp;gt;(x1, y1) (x2,y2)&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;x1 &amp;lt; x2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y1 &amp;lt; y2&amp;lt;/code&amp;gt; mulţimea elementelor &amp;lt;code&amp;gt;A[i][j]&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;x1 ≤ i ≤ x2&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;y1 ≤...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o matrice dreptunghiulară &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane cu valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, liniile şi coloanele fiind numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, respectiv de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Numim dreptunghi de colţuri &amp;lt;code&amp;gt;(x1, y1) (x2,y2)&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;x1 &amp;lt; x2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y1 &amp;lt; y2&amp;lt;/code&amp;gt; mulţimea elementelor &amp;lt;code&amp;gt;A[i][j]&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;x1 ≤ i ≤ x2&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;y1 ≤ j ≤ y2&amp;lt;/code&amp;gt;. Numim perimetru al dreptunghiului de colţuri &amp;lt;code&amp;gt;(x1, y1) (x2, y2)&amp;lt;/code&amp;gt; mulţimea elementelor &amp;lt;code&amp;gt;A[i][j]&amp;lt;/code&amp;gt; pentru care (&amp;lt;code&amp;gt;i = x1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y1 ≤ j ≤ y2&amp;lt;/code&amp;gt;) sau (&amp;lt;code&amp;gt;i = x2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y1 ≤ j ≤ y2&amp;lt;/code&amp;gt;) sau (&amp;lt;code&amp;gt;j = y1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;x1 ≤ i ≤ x2&amp;lt;/code&amp;gt;) sau (&amp;lt;code&amp;gt;j = y2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;x1 ≤ i ≤ x2&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinaţi diferenţa maximă dintre numărul de elemente egale cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi numărul de elemente egale cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; aflate pe perimetrul aceluiaşi dreptunghi, precum şi numărul de dreptunghiuri pentru care se obţine această diferenţă.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;peri.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, separate printr-un singur spaţiu. Pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii este dată matricea &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, numerele de pe aceeaşi linie fiind separate de câte un spaţiu.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def max_perimeter_diff(matrix):&lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    max_diff = float(&#039;-inf&#039;)&lt;br /&gt;
    count_max_diff_rects = 0&lt;br /&gt;
&lt;br /&gt;
    # Helper function to count 1&#039;s and 0&#039;s on the perimeter&lt;br /&gt;
    def count_perimeter(x1, y1, x2, y2):&lt;br /&gt;
        ones = 0&lt;br /&gt;
        zeros = 0&lt;br /&gt;
        for j in range(y1, y2 + 1):&lt;br /&gt;
            if matrix[x1][j] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
            if matrix[x2][j] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
        for i in range(x1 + 1, x2):&lt;br /&gt;
            if matrix[i][y1] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
            if matrix[i][y2] == 1:&lt;br /&gt;
                ones += 1&lt;br /&gt;
            else:&lt;br /&gt;
                zeros += 1&lt;br /&gt;
        return ones, zeros&lt;br /&gt;
&lt;br /&gt;
    # Iterate over all possible top-left corners (x1, y1)&lt;br /&gt;
    for x1 in range(m - 1):&lt;br /&gt;
        for y1 in range(n - 1):&lt;br /&gt;
            # Iterate over all possible bottom-right corners (x2, y2)&lt;br /&gt;
            for x2 in range(x1 + 1, m):&lt;br /&gt;
                for y2 in range(y1 + 1, n):&lt;br /&gt;
                    ones, zeros = count_perimeter(x1, y1, x2, y2)&lt;br /&gt;
                    diff = ones - zeros&lt;br /&gt;
                    if diff &amp;gt; max_diff:&lt;br /&gt;
                        max_diff = diff&lt;br /&gt;
                        count_max_diff_rects = 1&lt;br /&gt;
                    elif diff == max_diff:&lt;br /&gt;
                        count_max_diff_rects += 1&lt;br /&gt;
&lt;br /&gt;
    return max_diff, count_max_diff_rects&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
matrix = [&lt;br /&gt;
    [0, 1, 0, 1],&lt;br /&gt;
    [1, 0, 1, 0],&lt;br /&gt;
    [0, 1, 0, 1],&lt;br /&gt;
    [1, 0, 1, 0]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
max_diff, count_max_diff_rects = max_perimeter_diff(matrix)&lt;br /&gt;
print(f&amp;quot;Diferența maximă: {max_diff}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul de dreptunghiuri: {count_max_diff_rects}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;peri.out&amp;lt;/code&amp;gt; va conţine o singură linie pe care se află două numere întregi separate printr-un spaţiu. Primul număr este diferenţa maximă dintre numărul de elemente &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi numărul de elemente &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; de pe perimetrul unui dreptunghi. Al doilea întreg este numărul de dreptunghiuri pentru care diferenţa dintre numărul de elemente &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi numărul de elemente &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; de pe perimetru este maximă.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m, n ≤ 250&amp;lt;/code&amp;gt;&lt;br /&gt;
* Prin diferenţă nu se înţelege diferenţă în valoare absolută!&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;peri.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 5&lt;br /&gt;
 1 0 0 1 0 &lt;br /&gt;
 0 1 1 0 0 &lt;br /&gt;
 0 1 0 1 0 &lt;br /&gt;
 1 1 1 0 1&lt;br /&gt;
&amp;lt;code&amp;gt;peri.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 2&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1702_-_Cristale&amp;diff=10208</id>
		<title>1702 - Cristale</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1702_-_Cristale&amp;diff=10208"/>
		<updated>2024-07-31T12:53:55Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pietrele preţioase au fascinat  omenirea încă din timpuri străvechi iar cele mai renumite dintre ele, cristalele, au devenit atât simbolul durităţii cât şi al eternităţii. În urma unui studiu ştiinţific, pe un eşantion de formă dreptunghiulară se pot observa diferite tipuri de molecule, dispuse într-o geometrie perfectă, pe &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rânduri a câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; molecule fiecare, aliniate una lângă alta. O formaţiune cristalizabilă este alcătui...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pietrele preţioase au fascinat  omenirea încă din timpuri străvechi iar cele mai renumite dintre ele, cristalele, au devenit atât simbolul durităţii cât şi al eternităţii. În urma unui studiu ştiinţific, pe un eşantion de formă dreptunghiulară se pot observa diferite tipuri de molecule, dispuse într-o geometrie perfectă, pe &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rânduri a câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; molecule fiecare, aliniate una lângă alta. O formaţiune cristalizabilă este alcătuită din &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; molecule de acelaşi tip, învecinate două câte două, având una dintre cele patru forme din imaginea alăturată (fig.1).&lt;br /&gt;
&lt;br /&gt;
Fiecare formaţiune este înconjurată de jur-împrejur, ca în fig.2, de un înveliş special format şi el din molecule identice, de alt tip decât cele din formaţiunea cristalizabilă pe care o înconjoară şi o izolează de restul formaţiunilor moleculare. În acest fel, fiecare moleculă din formaţiunea cristalizabilă se învecinează la Nord, Sud, Est şi Vest cu o moleculă din aceeaşi formaţiune cristalizabilă sau cu o moleculă din învelişul special.&lt;br /&gt;
&lt;br /&gt;
Fiecare formaţiune cristalizabilă se bombardează cu raze &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; şi în acest fel are loc cristalizarea, proces prin care învelişul special se extinde peste formaţiunea cristalizabilă pe care o înconjoară, formând o singură structură din care se va dezvolta cristalul.&lt;br /&gt;
&lt;br /&gt;
= Cerințe =&lt;br /&gt;
&lt;br /&gt;
# Determinaţi numărul formaţiunilor cristalizabile ce pot fi identificate pe eşantionul analizat.&lt;br /&gt;
# Afişaţi eşantionul rezultat după cristalizare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;cristale.in&amp;lt;/code&amp;gt; conține pe prima linie un număr natural &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; reprezentând cerinţa care trebuie să fie rezolvată (1 sau 2). Pe cea de-a doua linie se află două numere naturale &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, separate printr-un spaţiu, având semnificaţia din enunţ. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale, separate prin câte un spaţiu, reprezentând moleculele din eşantionul analizat.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, atunci se va rezolva numai cerinţa 1, caz în care pe prima linie a fişierului &amp;lt;code&amp;gt;cristale.out&amp;lt;/code&amp;gt; va fi scris un număr natural reprezentând numărul formaţiunilor cristalizabile identificate pe eşantionul analizat. Dacă valoarea lui &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, atunci se va rezolva numai cerinţa 2. În acest caz, fişierul de ieşire &amp;lt;code&amp;gt;cristale.out&amp;lt;/code&amp;gt; va conţine pe fiecare dintre primele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii, câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale separate prin câte un spaţiu, reprezentând moleculele eşantionului rezultat după cristalizare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;4 ≤ M,N ≤ 800&amp;lt;/code&amp;gt; şi tipul fiecărei molecule este exprimat printr-un număr natural din intervalul &amp;lt;code&amp;gt;[1,16]&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pe marginea eşantionului nu pot fi identificate formaţiuni cristalizabile; există cel puţin o formaţiune cristalizabilă pe eşantionul analizat;&lt;br /&gt;
* eşantionul nu conţine formaţiuni cristalizabile lipite (cu celule vecine pe una din cele patru direcţii);&lt;br /&gt;
* pentru rezolvarea corectă a cerinţei 1 se acordă 30% din punctaj, iar pentru rezolvarea corectă a cerinţei 2 se acordă 70% din punctaj.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;cristale.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 6 8&lt;br /&gt;
 5 6 6 1 5 2 6 5&lt;br /&gt;
 6 9 9 6 1 7 1 2&lt;br /&gt;
 6 6 9 6 3 4 1 6&lt;br /&gt;
 2 2 6 3 4 7 4 2&lt;br /&gt;
 8 8 2 4 7 7 4 6 &lt;br /&gt;
 8 2 7 2 4 4 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;cristale.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se va rezolva cerinţa 1 a problemei.&lt;br /&gt;
&lt;br /&gt;
Eşantionul are &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; rânduri cu câte &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; molecule pe fiecare rând. Pe acest eşantion observăm o formaţiune cristalizabilă cu celule de tip &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;, izolată de învelişul special format din celule identice, toate de tip &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; şi o formaţiune cristalizabilă cu celule de tip &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;,  izolată de învelişul special format din celule identice, toate de tip &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Formaţiunea de &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; molecule de tip &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; nu este o formaţiune cristalizabilă întrucât se află pe marginea eşantionului.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;cristale.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 6 8&lt;br /&gt;
 5 6 6 1 5 2 6 5&lt;br /&gt;
 6 9 9 6 1 7 1 2&lt;br /&gt;
 6 6 9 6 3 4 1 6&lt;br /&gt;
 2 2 6 3 4 7 4 2&lt;br /&gt;
 8 8 2 4 7 7 4 6 &lt;br /&gt;
 8 2 7 2 4 4 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;cristale.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se va rezolva cerinţa 1 a problemei.&lt;br /&gt;
&lt;br /&gt;
Eşantionul are &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; rânduri cu câte &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; molecule pe fiecare rând. Pe acest eşantion observăm o formaţiune cristalizabilă cu celule de tip &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;, izolată de învelişul special format din celule identice, toate de tip &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; şi o formaţiune cristalizabilă cu celule de tip &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;,  izolată de învelişul special format din celule identice, toate de tip &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Formaţiunea de &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; molecule de tip &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; nu este o formaţiune cristalizabilă întrucât se află pe marginea eşantionului.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def is_valid_position(x, y, M, N):&lt;br /&gt;
    return 0 &amp;lt;= x &amp;lt; M and 0 &amp;lt;= y &amp;lt; N&lt;br /&gt;
&lt;br /&gt;
def identify_crystalline_formations(sample, M, N):&lt;br /&gt;
    directions = [&lt;br /&gt;
        [(0, 0), (0, 1), (0, 2)],  # Orizontal&lt;br /&gt;
        [(0, 0), (1, 0), (2, 0)],  # Vertical&lt;br /&gt;
        [(0, 0), (0, 1), (1, 0)],  # L form&lt;br /&gt;
        [(0, 0), (1, 0), (1, 1)],  # Inverse L form&lt;br /&gt;
    ]&lt;br /&gt;
    &lt;br /&gt;
    formations = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(M):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            for direction in directions:&lt;br /&gt;
                molecules = set()&lt;br /&gt;
                valid = True&lt;br /&gt;
                for dx, dy in direction:&lt;br /&gt;
                    x, y = i + dx, j + dy&lt;br /&gt;
                    if not is_valid_position(x, y, M, N):&lt;br /&gt;
                        valid = False&lt;br /&gt;
                        break&lt;br /&gt;
                    molecules.add(sample[x][y])&lt;br /&gt;
                &lt;br /&gt;
                if valid and len(molecules) == 1:&lt;br /&gt;
                    formations.append((i, j, direction))&lt;br /&gt;
    &lt;br /&gt;
    return formations&lt;br /&gt;
&lt;br /&gt;
def apply_crystallization(sample, formations, M, N):&lt;br /&gt;
    for (i, j, direction) in formations:&lt;br /&gt;
        surrounding_type = None&lt;br /&gt;
        formation_type = sample[i][j]&lt;br /&gt;
        &lt;br /&gt;
        # Identify the surrounding type&lt;br /&gt;
        for dx, dy in direction:&lt;br /&gt;
            x, y = i + dx, j + dy&lt;br /&gt;
            for nx, ny in [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]:&lt;br /&gt;
                if is_valid_position(nx, ny, M, N) and sample[nx][ny] != formation_type:&lt;br /&gt;
                    surrounding_type = sample[nx][ny]&lt;br /&gt;
                    break&lt;br /&gt;
            if surrounding_type:&lt;br /&gt;
                break&lt;br /&gt;
        &lt;br /&gt;
        # Apply the crystallization&lt;br /&gt;
        if surrounding_type:&lt;br /&gt;
            for dx, dy in direction:&lt;br /&gt;
                x, y = i + dx, j + dy&lt;br /&gt;
                sample[x][y] = surrounding_type&lt;br /&gt;
&lt;br /&gt;
def print_sample(sample):&lt;br /&gt;
    for row in sample:&lt;br /&gt;
        print(&#039; &#039;.join(map(str, row)))&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
M = 5&lt;br /&gt;
N = 5&lt;br /&gt;
sample = [&lt;br /&gt;
    [1, 1, 1, 2, 3],&lt;br /&gt;
    [1, 4, 2, 3, 2],&lt;br /&gt;
    [4, 2, 3, 2, 2],&lt;br /&gt;
    [2, 2, 3, 1, 4],&lt;br /&gt;
    [3, 1, 4, 4, 4],&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
formations = identify_crystalline_formations(sample, M, N)&lt;br /&gt;
print(f&amp;quot;Formațiuni cristalizabile: {formations}&amp;quot;)&lt;br /&gt;
apply_crystallization(sample, formations, M, N)&lt;br /&gt;
print(&amp;quot;Eșantion după cristalizare:&amp;quot;)&lt;br /&gt;
print_sample(sample)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1699_-_Robotel&amp;diff=10207</id>
		<title>1699 - Robotel</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1699_-_Robotel&amp;diff=10207"/>
		<updated>2024-07-31T12:51:51Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Tudor a primit un joc educaţional numit “Roboţel” cu ajutorul căruia va învăţa punctele cardinale Nord, Est, Sud, Vest. Jocul constă dintr-un roboţel care se deplasează pe o tablă de forma unei matrici pătratice, împărţită în &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; coloane. Fiecare căsuţă, aflată la intersecţia dintre o linie şi o coloană, este fie căsuță „liberă”, fie căsuță „semnalizator”, caz în care este etichetată cu una din li...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tudor a primit un joc educaţional numit “Roboţel” cu ajutorul căruia va învăţa punctele cardinale Nord, Est, Sud, Vest. Jocul constă dintr-un roboţel care se deplasează pe o tablă de forma unei matrici pătratice, împărţită în &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; coloane. Fiecare căsuţă, aflată la intersecţia dintre o linie şi o coloană, este fie căsuță „liberă”, fie căsuță „semnalizator”, caz în care este etichetată cu una din literele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, reprezentând &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; sensuri posibile de deplasare. Când roboțelul ajunge într-o „căsuţă semnalizator”, el îşi schimbă sensul de deplasare astfel:&lt;br /&gt;
&lt;br /&gt;
* Dacă căsuţa este etichetată cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; atunci roboţelul se va deplasa în continuare de jos în sus;&lt;br /&gt;
* Dacă căsuţa este etichetată cu &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; atunci roboţelul se va deplasa în continuare de la stânga la dreapta;&lt;br /&gt;
* Dacă căsuţa este etichetată cu &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; atunci roboţelul se va deplasa în continuare de sus în jos;&lt;br /&gt;
* Dacă căsuţa este etichetată cu &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; atunci roboţelul se va deplasa în continuare de la dreapta la stânga.&lt;br /&gt;
&lt;br /&gt;
Două căsuțe semnalizator formează o pereche „&#039;&#039;&#039;blocantă&#039;&#039;&#039;” dacă:&lt;br /&gt;
&lt;br /&gt;
* Se află pe aceeași linie și conțin literele &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, căsuța cu &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; are coloana mai mică decât a celei etichetate cu &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; și între ele, pe aceeași linie nu există alte căsuțe semnalizatoare.&lt;br /&gt;
* Se află pe aceeași coloană și conțin literele &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, căsuța cu &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; are linia mai mică decât a celei etichetate cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și între ele, pe aceeași coloană nu există alte căsuțe semnalizatoare.&lt;br /&gt;
&lt;br /&gt;
În figura 1, de exemplu, sunt &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; perechi blocante: Perechea &amp;lt;code&amp;gt;(1,2) (5.2)&amp;lt;/code&amp;gt; și perechea &amp;lt;code&amp;gt;(2,3) (2,5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Roboţelul porneşte din căsuţa &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt;, aflată pe prima linie și prima coloană şi dacă aceasta este liberă, se deplasează, în cadrul primei linii, de la stânga la dreapta. În cazul în care căsuța de pornire &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt; este semnalizator, atunci roboțelul se va deplasa pe direcția indicată de litera cu care este etichetată. Considerând că roboțelul se deplasează pe tablă, el se oprește doar în următoarele situații:&lt;br /&gt;
&lt;br /&gt;
* Roboţelul intră într-o căsuţă liberă aflată pe prima sau ultima linie, respectiv prima sau ultima coloană, caz în care dacă s-ar menține sensul deplasării actuale roboțelul ar părăsi tabla;&lt;br /&gt;
* Roboțelul intră într-o „căsuţă semnalizator” a unei perechi blocantă și se va opri în cealaltă căsuță a perechii.&lt;br /&gt;
&lt;br /&gt;
De exemplu, în Figura 2, roboțelul ajunge în căsuța liberă &amp;lt;code&amp;gt;(3,5)&amp;lt;/code&amp;gt; unde se oprește. În Figura 3, roboțelul se va opri în căsuța &amp;lt;code&amp;gt;(4,1)&amp;lt;/code&amp;gt; deoarece dacă ar schimba sensul spre Est, ar reveni în ultima căsuță semnalizator vizitată, &amp;lt;code&amp;gt;(4,3)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Roboțelul înaintează o căsuță într-un pas, în sensul de deplasare.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care, cunoscând numărul &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; de linii şi coloane și cele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; căsuţe semnalizator, determină:&lt;br /&gt;
&lt;br /&gt;
# Toate perechile blocante de pe tablă;&lt;br /&gt;
# Numărul de pași efectuați pe fiecare sens în parte:  Nord, Est, Sud și Vest&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;robotel.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; reprezentând cerința din problemă care trebuie rezolvată, pe a doua linie, separate printr-un spaţiu numărul natural &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; şi numărul natural &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; linii, două numere naturale și un caracter, separate prin câte un spațiu reprezentând, în ordine, linia, coloana şi litera unei căsuţe semnalizator.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, se va rezolva doar cerința 1). Fişierul de ieşire &amp;lt;code&amp;gt;robotel.out&amp;lt;/code&amp;gt; va conține perechile blocante, pentru fiecare pereche de căsuțe afișându-se &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale separate printr-un spaţiu, reprezentând, în ordine, linia, coloana primei căsuțe semnalizator, respectiv linia și coloana celei de-a doua căsuțe semnalizator. Perechile de căsuțe vor fi afișate pe linii ordonat după regula: o pereche &amp;lt;code&amp;gt;L1 C1 L2 C2&amp;lt;/code&amp;gt; va fi afișată înaintea perechii &amp;lt;code&amp;gt;L3 C3 L4 C4&amp;lt;/code&amp;gt; dacă &amp;lt;code&amp;gt;L1&amp;lt;L3&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;L1=L3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;C1&amp;lt;C3&amp;lt;/code&amp;gt;, adică se va afișa mai întâi perechea cu prima căsuță având linia mai mică decât a primei căsuțe din cealaltă pereche sau la linii egale, va fi afișată perechea cu coloana mai mică. Dacă nu există astfel de perechi de căsuțe, în fișierul de ieșire se va afișa valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, se va rezolva doar cerința 2). Fişierul de ieşire &amp;lt;code&amp;gt;robotel.out&amp;lt;/code&amp;gt; va conţine &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale separate printr-un spaţiu, reprezentând, în ordine, numărul de pași parcurși de roboţel în sensurile Nord, Est, Sud, și Vest.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ R ≤ 200&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ K ≤ R*R&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru rezolvarea corectă a fiecărei cerinţe se obțin câte 50 de puncte&lt;br /&gt;
* O căsuță semnalizator conține o singură literă&lt;br /&gt;
* Pentru cerința 2 se garantează că în toate testele deplasarea roboțelului se oprește!&lt;br /&gt;
&lt;br /&gt;
= Exemplu =&lt;br /&gt;
&amp;lt;code&amp;gt;robotel.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 5 4&lt;br /&gt;
 1 3 S&lt;br /&gt;
 3 1 E&lt;br /&gt;
 5 1 N&lt;br /&gt;
 5 3 V&lt;br /&gt;
&amp;lt;code&amp;gt;robotel.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Nu există perechi blocante pe tablă care ar putea opri roboţelul.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def find_blocking_pairs(R, semnalizatori):&lt;br /&gt;
    # Găsirea perechilor blocante&lt;br /&gt;
    perechi_blocante = []&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgerea liniilor pentru perechi E-V&lt;br /&gt;
    for i in range(R):&lt;br /&gt;
        e_index = -1&lt;br /&gt;
        for j in range(R):&lt;br /&gt;
            if (i, j) in semnalizatori and semnalizatori[(i, j)] == &#039;E&#039;:&lt;br /&gt;
                e_index = j&lt;br /&gt;
            elif (i, j) in semnalizatori and semnalizatori[(i, j)] == &#039;V&#039;:&lt;br /&gt;
                if e_index != -1:&lt;br /&gt;
                    perechi_blocante.append(((i, e_index), (i, j)))&lt;br /&gt;
                    e_index = -1  # Resetăm indexul pentru următoarea pereche&lt;br /&gt;
&lt;br /&gt;
    # Parcurgerea coloanelor pentru perechi S-N&lt;br /&gt;
    for j in range(R):&lt;br /&gt;
        s_index = -1&lt;br /&gt;
        for i in range(R):&lt;br /&gt;
            if (i, j) in semnalizatori and semnalizatori[(i, j)] == &#039;S&#039;:&lt;br /&gt;
                s_index = i&lt;br /&gt;
            elif (i, j) in semnalizatori and semnalizatori[(i, j)] == &#039;N&#039;:&lt;br /&gt;
                if s_index != -1:&lt;br /&gt;
                    perechi_blocante.append(((s_index, j), (i, j)))&lt;br /&gt;
                    s_index = -1  # Resetăm indexul pentru următoarea pereche&lt;br /&gt;
    &lt;br /&gt;
    return perechi_blocante&lt;br /&gt;
&lt;br /&gt;
def simulate_robot(R, semnalizatori, perechi_blocante):&lt;br /&gt;
    # Direcțiile Nord, Est, Sud, Vest&lt;br /&gt;
    directions = {&#039;N&#039;: (-1, 0), &#039;E&#039;: (0, 1), &#039;S&#039;: (1, 0), &#039;V&#039;: (0, -1)}&lt;br /&gt;
    steps_count = {&#039;N&#039;: 0, &#039;E&#039;: 0, &#039;S&#039;: 0, &#039;V&#039;: 0}&lt;br /&gt;
    &lt;br /&gt;
    # Poziția inițială și direcția inițială&lt;br /&gt;
    x, y = 0, 0&lt;br /&gt;
    direction = &#039;E&#039;&lt;br /&gt;
    &lt;br /&gt;
    visited = set()&lt;br /&gt;
    &lt;br /&gt;
    while True:&lt;br /&gt;
        # Marcați poziția curentă ca vizitată&lt;br /&gt;
        visited.add((x, y))&lt;br /&gt;
        &lt;br /&gt;
        # Verificați dacă poziția curentă este o căsuță semnalizator&lt;br /&gt;
        if (x, y) in semnalizatori:&lt;br /&gt;
            direction = semnalizatori[(x, y)]&lt;br /&gt;
        &lt;br /&gt;
        # Calculați următoarea poziție&lt;br /&gt;
        dx, dy = directions[direction]&lt;br /&gt;
        new_x, new_y = x + dx, y + dy&lt;br /&gt;
        &lt;br /&gt;
        # Verificați dacă următoarea poziție este în afara grilei&lt;br /&gt;
        if not (0 &amp;lt;= new_x &amp;lt; R and 0 &amp;lt;= new_y &amp;lt; R):&lt;br /&gt;
            break&lt;br /&gt;
        &lt;br /&gt;
        # Verificați dacă se întâlnește o pereche blocantă&lt;br /&gt;
        for (ax, ay), (bx, by) in perechi_blocante:&lt;br /&gt;
            if (x, y) == (ax, ay) and (new_x, new_y) == (bx, by):&lt;br /&gt;
                x, y = bx, by&lt;br /&gt;
                break&lt;br /&gt;
            elif (x, y) == (bx, by) and (new_x, new_y) == (ax, ay):&lt;br /&gt;
                x, y = ax, ay&lt;br /&gt;
                break&lt;br /&gt;
        else:&lt;br /&gt;
            # Dacă nu se întâlnește o pereche blocantă, actualizați poziția&lt;br /&gt;
            x, y = new_x, new_y&lt;br /&gt;
        &lt;br /&gt;
        # Incrementați contorul de pași pentru direcția curentă&lt;br /&gt;
        steps_count[direction] += 1&lt;br /&gt;
    &lt;br /&gt;
    return steps_count&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
R = 5&lt;br /&gt;
semnalizatori = {&lt;br /&gt;
    (0, 1): &#039;E&#039;, (4, 1): &#039;V&#039;,  # Pereche blocantă (0,1) (4,1)&lt;br /&gt;
    (1, 2): &#039;S&#039;, (1, 4): &#039;N&#039;,  # Pereche blocantă (1,2) (1,4)&lt;br /&gt;
    (3, 2): &#039;N&#039;, (4, 2): &#039;S&#039;,  # Nu formează pereche blocantă&lt;br /&gt;
}&lt;br /&gt;
perechi_blocante = find_blocking_pairs(R, semnalizatori)&lt;br /&gt;
steps_count = simulate_robot(R, semnalizatori, perechi_blocante)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Perechi blocante: {perechi_blocante}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul de pași în fiecare direcție: {steps_count}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1383_-_Avioane&amp;diff=10206</id>
		<title>1383 - Avioane</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1383_-_Avioane&amp;diff=10206"/>
		<updated>2024-07-31T12:48:04Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: “Avioane pe hârtie” este un joc ce se joacă în doi, fiecare jucător având la dispoziţie o foaie de hârtie (de matematică) şi ceva de scris.  Pe foaia ta de matematică, ai desenat un caroiaj cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; coloane. La un moment al jocului, în acest caroiaj sunt deja plasate &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; avioane, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Fiecare avion e format din exact &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; celule (o celulă cabina, apoi &amp;lt;code&amp;gt;5&amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;“Avioane pe hârtie” este un joc ce se joacă în doi, fiecare jucător având la dispoziţie o foaie de hârtie (de matematică) şi ceva de scris.&lt;br /&gt;
&lt;br /&gt;
Pe foaia ta de matematică, ai desenat un caroiaj cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; coloane. La un moment al jocului, în acest caroiaj sunt deja plasate &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; avioane, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Fiecare avion e format din exact &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; celule (o celulă cabina, apoi &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; celule aripa mare, o celulă culoar şi &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; celule aripa mică). Avioanele desenate nu se suprapun şi în funcţie de modul în care sunt amplasate pot fi de &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; tipuri:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; – cabina orientată spre nord;&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; – cabina orientată spre est.&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; – cabina orientată spre sud;&lt;br /&gt;
* &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; – cabina orientată spre vest.&lt;br /&gt;
&lt;br /&gt;
Pentru a putea identifica un avion pe foaie, toate celulele acoperite de avion sunt marcate cu numărul de ordine al avionului. Poziţiile neacoperite de avioane au valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Adversarul, fără a vedea foaia ta, lansează &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; lovituri. Fiecare lovitură afectează o singură celulă a caroiajului. Dacă loviturile afectează cel puţin una dintre celulele acoperite de un avion, se consideră că avionul a fost avariat. Un avion avariat este considerat avion doborât dacă a fost lovită cabina sa sau cel puțin &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; celule dintre cele &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; ale sale.&lt;br /&gt;
&lt;br /&gt;
Dată fiind configuraţia caroiajului şi poziţiile loviturilor lansate de adversar, să se determine:&lt;br /&gt;
&lt;br /&gt;
a. numărul total de avioane desenate în caroiaj;&lt;br /&gt;
&lt;br /&gt;
b. numărul de avioane de fiecare tip;&lt;br /&gt;
&lt;br /&gt;
c. numărul de avioane avariate, fără a fi doborâte;&lt;br /&gt;
&lt;br /&gt;
d. numărul de avioane doborâte.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul &amp;lt;code&amp;gt;avioane.in&amp;lt;/code&amp;gt; conţine pe prima linie numerele naturale &amp;lt;code&amp;gt;N L&amp;lt;/code&amp;gt;, reprezentând dimensiunea caroiajului, respectiv numărul de lovituri lansate de adversar. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se vor găsi câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale, reprezentând configuraţia caroiajului, conform specificaţiilor din enunţ. Pe următoarele &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; linii se află câte două numere naturale &amp;lt;code&amp;gt;X Y&amp;lt;/code&amp;gt;, reprezentând linia, respectiv coloana unei celule lovite. Numerele scrise pe aceeaşi linie sunt separate prin spaţii.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul &amp;lt;code&amp;gt;avioane.out&amp;lt;/code&amp;gt; va conţine pe prima linie numărul total de avioane de pe foaie; pe următoarele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; linii se vor scrie &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale, câte unul pe linie, reprezentând în ordine numărul avioanelor de tip &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, tip &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, tip &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și respectiv tip &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;. Pe următoarea linie se va scrie numărul de avioane avariate, care nu au fost doborâte, iar pe ultima linie va fi scris numărul de avioane doborâte.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;8 ≤ N ≤ 300&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;N/2 ≤ L ≤ 2*N&amp;lt;/code&amp;gt;&lt;br /&gt;
* Liniile şi respectiv coloanele caroiajului sunt numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;avioane.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 5&lt;br /&gt;
 0 0 0 0 0 0 0 0 &lt;br /&gt;
 0 0 0 0 1 1 1 0 &lt;br /&gt;
 0 0 0 0 0 1 0 0 &lt;br /&gt;
 0 0 0 1 1 1 1 1 &lt;br /&gt;
 0 0 2 2 2 1 0 0 &lt;br /&gt;
 0 0 0 2 0 0 0 0 &lt;br /&gt;
 0 2 2 2 2 2 0 0 &lt;br /&gt;
 0 0 0 2 0 0 0 0 &lt;br /&gt;
 6 6&lt;br /&gt;
 5 3&lt;br /&gt;
 3 6&lt;br /&gt;
 7 3&lt;br /&gt;
 8 5&lt;br /&gt;
&amp;lt;code&amp;gt;avioane.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
În matricea de &amp;lt;code&amp;gt;8x8&amp;lt;/code&amp;gt; avem &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; avioane, ambele de tip &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Cabinele sunt în coordonatele &amp;lt;code&amp;gt;(5,6)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(8,4)&amp;lt;/code&amp;gt;. Deci pe prima linie în fișierul de ieșire va fi &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; linii numărul avioanelor de fiecare tip: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, fiecare pe linie nouă.&lt;br /&gt;
&lt;br /&gt;
În această reprezentare avem &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; lovituri. Cu cele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; lovituri am reușit să lovim ambele avioane, fără a lovi cabina sau cel puțin &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; lovituri/avion. Astfel următoarele &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; valori din fișierul de ieșire sunt &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
În această diagramă nu mai putem adăuga un avion de tip &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; astfel pe ultima linie vom avea valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def process_game(N, M, avioane, L, lovituri):&lt;br /&gt;
    # Initializare matrice&lt;br /&gt;
    matrice = [[0] * N for _ in range(N)]&lt;br /&gt;
    &lt;br /&gt;
    # Plasarea avioanelor în matrice&lt;br /&gt;
    avion_celule = {}&lt;br /&gt;
    avion_tip = {}&lt;br /&gt;
    &lt;br /&gt;
    for avion in avioane:&lt;br /&gt;
        id, tip, linie, coloana = avion&lt;br /&gt;
        avion_celule[id] = []&lt;br /&gt;
        avion_tip[id] = tip&lt;br /&gt;
        &lt;br /&gt;
        if tip == 1:  # cabina spre nord&lt;br /&gt;
            coords = [(linie, coloana), (linie+1, coloana-2), (linie+1, coloana-1), (linie+1, coloana),&lt;br /&gt;
                      (linie+1, coloana+1), (linie+1, coloana+2), (linie+2, coloana), &lt;br /&gt;
                      (linie+3, coloana-1), (linie+3, coloana), (linie+3, coloana+1)]&lt;br /&gt;
        elif tip == 2:  # cabina spre est&lt;br /&gt;
            coords = [(linie, coloana), (linie-2, coloana-1), (linie-1, coloana-1), (linie, coloana-1),&lt;br /&gt;
                      (linie+1, coloana-1), (linie+2, coloana-1), (linie, coloana-2), &lt;br /&gt;
                      (linie-1, coloana-3), (linie, coloana-3), (linie+1, coloana-3)]&lt;br /&gt;
        elif tip == 3:  # cabina spre sud&lt;br /&gt;
            coords = [(linie, coloana), (linie-1, coloana-2), (linie-1, coloana-1), (linie-1, coloana),&lt;br /&gt;
                      (linie-1, coloana+1), (linie-1, coloana+2), (linie-2, coloana),&lt;br /&gt;
                      (linie-3, coloana-1), (linie-3, coloana), (linie-3, coloana+1)]&lt;br /&gt;
        elif tip == 4:  # cabina spre vest&lt;br /&gt;
            coords = [(linie, coloana), (linie-2, coloana+1), (linie-1, coloana+1), (linie, coloana+1),&lt;br /&gt;
                      (linie+1, coloana+1), (linie+2, coloana+1), (linie, coloana+2),&lt;br /&gt;
                      (linie-1, coloana+3), (linie, coloana+3), (linie+1, coloana+3)]&lt;br /&gt;
        &lt;br /&gt;
        for coord in coords:&lt;br /&gt;
            r, c = coord&lt;br /&gt;
            if 0 &amp;lt;= r &amp;lt; N and 0 &amp;lt;= c &amp;lt; N:&lt;br /&gt;
                matrice[r][c] = id&lt;br /&gt;
                avion_celule[id].append((r, c))&lt;br /&gt;
    &lt;br /&gt;
    # Procesarea loviturilor&lt;br /&gt;
    lovituri_set = set(lovituri)&lt;br /&gt;
    &lt;br /&gt;
    avioane_doborate = 0&lt;br /&gt;
    avioane_avariate = 0&lt;br /&gt;
    &lt;br /&gt;
    for id, celule in avion_celule.items():&lt;br /&gt;
        lovituri_in_celule = [celula for celula in celule if celula in lovituri_set]&lt;br /&gt;
        numar_lovituri = len(lovituri_in_celule)&lt;br /&gt;
        cabina_lovita = celule[0] in lovituri_set&lt;br /&gt;
        &lt;br /&gt;
        if numar_lovituri &amp;gt;= 5 or cabina_lovita:&lt;br /&gt;
            avioane_doborate += 1&lt;br /&gt;
        elif numar_lovituri &amp;gt; 0:&lt;br /&gt;
            avioane_avariate += 1&lt;br /&gt;
    &lt;br /&gt;
    # Numărarea tipurilor de avioane&lt;br /&gt;
    tipuri_avioane = {1: 0, 2: 0, 3: 0, 4: 0}&lt;br /&gt;
    for tip in avion_tip.values():&lt;br /&gt;
        tipuri_avioane[tip] += 1&lt;br /&gt;
    &lt;br /&gt;
    return M, tipuri_avioane, avioane_avariate, avioane_doborate&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
N = 10&lt;br /&gt;
M = 2&lt;br /&gt;
avioane = [&lt;br /&gt;
    (1, 1, 2, 2),  # avion 1, tip 1 (nord), cabina la (2, 2)&lt;br /&gt;
    (2, 2, 5, 5)   # avion 2, tip 2 (est), cabina la (5, 5)&lt;br /&gt;
]&lt;br /&gt;
L = 3&lt;br /&gt;
lovituri = [(2, 2), (5, 5), (4, 5)]&lt;br /&gt;
&lt;br /&gt;
total_avioane, tipuri_avioane, avioane_avariate, avioane_doborate = process_game(N, M, avioane, L, lovituri)&lt;br /&gt;
print(f&amp;quot;Numărul total de avioane: {total_avioane}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul de avioane de fiecare tip: {tipuri_avioane}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul de avioane avariate, fără a fi doborâte: {avioane_avariate}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul de avioane doborâte: {avioane_doborate}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3632_-_Matrix_replace&amp;diff=10205</id>
		<title>3632 - Matrix replace</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3632_-_Matrix_replace&amp;diff=10205"/>
		<updated>2024-07-31T12:45:54Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Aky, un elev pasionat de matematică, analiza într-o zi curios o matrice pătratică de dimensiune &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Acesta a observat că această matrice are anumite submatrice, la rândul lor pătratice, ale căror elemente sunt egale. Astfel și-a pus o întrebare: pentru o matrice dată, care este submatricea pătratică de dimensiune maximă a acesteia cu toate elementele egale pe care o pot obține, știind că am voie să schimb valoarea a maxim &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; elemente...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aky, un elev pasionat de matematică, analiza într-o zi curios o matrice pătratică de dimensiune &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Acesta a observat că această matrice are anumite submatrice, la rândul lor pătratice, ale căror elemente sunt egale. Astfel și-a pus o întrebare: pentru o matrice dată, care este submatricea pătratică de dimensiune maximă a acesteia cu toate elementele egale pe care o pot obține, știind că am voie să schimb valoarea a maxim &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; elemente din matricea dată cu orice valoare consider și care este numărul minim de elemente ce trebuie schimbate pentru a obține o astfel de submatrice. Acesta ar rezolva problema de unul singur, dar este ocupat chiar acum deci vă cere vouă ajutorul!&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;matrix_replace.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, reprezentând dimensiunea matricei inițiale, respectiv câte elemente am voie maxim să schimb din aceasta, iar pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale reprezentând elementele matricei inițiale.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;matrix_replace.out&amp;lt;/code&amp;gt; va conține pe prima linie numărele &amp;lt;code&amp;gt;D M&amp;lt;/code&amp;gt;, reprezentând dimesiunea maximă a unei submatrice cu proprietatea din enunț, respectiv numărul minim de elemente ale căror valori trebuie schimbate pentru a obține această submatrice.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 150&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ K ≤ N * N&amp;lt;/code&amp;gt;&lt;br /&gt;
* elementele matricei vor fi numere naturale mai mici sau egale ca &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru o matrice dată, o submatrice a acesteia având coordonatele colțului stânga-sus &amp;lt;code&amp;gt;x1 y1&amp;lt;/code&amp;gt; și coordonatele colțului dreapta-jos &amp;lt;code&amp;gt;x2 y2&amp;lt;/code&amp;gt; este formată din toate elementele din matrice având indicele liniei în intervalul &amp;lt;code&amp;gt;[x1, x2]&amp;lt;/code&amp;gt; și indicele coloanei în intervalul &amp;lt;code&amp;gt;[y1, y2]&amp;lt;/code&amp;gt;. Această submatrice se numește submatrice pătratică dacă are același număr de linii și coloane&lt;br /&gt;
* &#039;&#039;&#039;Subtask 1&#039;&#039;&#039;: pentru &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte &amp;lt;code&amp;gt;N ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Subtask 2&#039;&#039;&#039;: pentru alte &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; de puncte numărul de valori distince din matrice este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K = 0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N ≤ 150&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Subtask 3&#039;&#039;&#039;: pentru alte &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte pot exista oricâte valori distincte în matrice, &amp;lt;code&amp;gt;N ≤ 100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K ≤ N * N&amp;lt;/code&amp;gt; și valoarea maximă din matrice este mai mică sau egală decât &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Subtask 4&#039;&#039;&#039;: pentru restul punctelor se păstrează condițiile inițiale: &amp;lt;code&amp;gt;1 ≤ N ≤ 150&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0 ≤ K ≤ N * N&amp;lt;/code&amp;gt; și elementele matricei vor fi numere naturale nenule mai mici sau egale ca &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;matrix_replace.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5&lt;br /&gt;
 1 2 3&lt;br /&gt;
 4 5 6&lt;br /&gt;
 7 8 9&lt;br /&gt;
&amp;lt;code&amp;gt;matrix_replace.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Putem de exemplu obține o submatrice pătratică de dimenisiune &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; schimbând valorile elementelor de coordonate: &amp;lt;code&amp;gt;1 2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2 1&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;2 2&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Observăm că numărul minim de schimbări de elemente este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, deci în acest caz &amp;lt;code&amp;gt;K = 5&amp;lt;/code&amp;gt;, numărul de schimbări maxime pe care le putem efectua, nu este atins.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def preprocess_matrix(matrix, N):&lt;br /&gt;
    # Compute the prefix sum matrix&lt;br /&gt;
    prefix_sum = [[0] * (N + 1) for _ in range(N + 1)]&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            prefix_sum[i + 1][j + 1] = matrix[i][j] + prefix_sum[i + 1][j] + prefix_sum[i][j + 1] - prefix_sum[i][j]&lt;br /&gt;
    return prefix_sum&lt;br /&gt;
&lt;br /&gt;
def num_changes_to_uniform(matrix, prefix_sum, N, size, top, left):&lt;br /&gt;
    # Calculate the number of changes to make the submatrix uniform&lt;br /&gt;
    total_elements = size * size&lt;br /&gt;
    sum_elements = (prefix_sum[top + size][left + size] - prefix_sum[top + size][left]&lt;br /&gt;
                    - prefix_sum[top][left + size] + prefix_sum[top][left])&lt;br /&gt;
    # The most frequent element will be the target, so calculate changes needed&lt;br /&gt;
    # Assume the target value is 1&lt;br /&gt;
    changes_if_target_1 = total_elements - sum_elements&lt;br /&gt;
    # Assume the target value is 0&lt;br /&gt;
    changes_if_target_0 = sum_elements&lt;br /&gt;
    return min(changes_if_target_1, changes_if_target_0)&lt;br /&gt;
&lt;br /&gt;
def find_max_square_submatrix(matrix, N, K):&lt;br /&gt;
    prefix_sum = preprocess_matrix(matrix, N)&lt;br /&gt;
    &lt;br /&gt;
    max_size = 0&lt;br /&gt;
    min_changes = float(&#039;inf&#039;)&lt;br /&gt;
    &lt;br /&gt;
    for size in range(1, N + 1):&lt;br /&gt;
        for i in range(N - size + 1):&lt;br /&gt;
            for j in range(N - size + 1):&lt;br /&gt;
                changes = num_changes_to_uniform(matrix, prefix_sum, N, size, i, j)&lt;br /&gt;
                if changes &amp;lt;= K:&lt;br /&gt;
                    if size &amp;gt; max_size:&lt;br /&gt;
                        max_size = size&lt;br /&gt;
                        min_changes = changes&lt;br /&gt;
                    elif size == max_size:&lt;br /&gt;
                        min_changes = min(min_changes, changes)&lt;br /&gt;
                        &lt;br /&gt;
    return max_size, min_changes&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
N = 4&lt;br /&gt;
K = 3&lt;br /&gt;
matrix = [&lt;br /&gt;
    [1, 0, 0, 1],&lt;br /&gt;
    [0, 1, 0, 0],&lt;br /&gt;
    [1, 1, 1, 0],&lt;br /&gt;
    [1, 0, 1, 1]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
max_size, min_changes = find_max_square_submatrix(matrix, N, K)&lt;br /&gt;
print(f&amp;quot;Dimensiunea maximă: {max_size}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul minim de schimbări: {min_changes}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1221_-_PieseSah&amp;diff=10204</id>
		<title>1221 - PieseSah</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1221_-_PieseSah&amp;diff=10204"/>
		<updated>2024-07-31T05:50:41Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: = Cerința = Se consideră o tablă de șah de dimensiune &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (alcătuită din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii si &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane), pe care se află &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; piese de șah, fiecare putând fi: pion, rege, regină, nebun, tură sau cal). Se dau coordonatele a &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; căsuțe de pe tablă și se cere să se verifice pentru fiecare dacă este atacată, ocupată sau neatacată de piesele care se află pe tablă .  = Date de intrare = Fișierul de intrare &amp;lt;cod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se consideră o tablă de șah de dimensiune &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (alcătuită din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii si &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane), pe care se află &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; piese de șah, fiecare putând fi: pion, rege, regină, nebun, tură sau cal). Se dau coordonatele a &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; căsuțe de pe tablă și se cere să se verifice pentru fiecare dacă este atacată, ocupată sau neatacată de piesele care se află pe tablă .&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;piesesah.in&amp;lt;/code&amp;gt; conține pe prima linie trei numere &amp;lt;code&amp;gt;n m t&amp;lt;/code&amp;gt;. Următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conțin un caracter, literă mică (reprezentând tipul piesei) urmat de două numere naturale reprezentând coordonatele piesei. Următoarele &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; linii conțin câte două numere naturale reprezentând coordonatele unei căsuțe care trebuie verificată.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;piesesah.out&amp;lt;/code&amp;gt; va conține pe &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; linii câte un singur număr natural &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, după cum căsuța corespunzătoare este neatacată, atacată sau ocupată.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m &amp;lt; n * n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ t ≤ 50000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nu vor exista două piese pe aceeași poziție;&lt;br /&gt;
* Caracterele care precizează piesele de pe tablă pot fi:&lt;br /&gt;
** &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; – pion;&lt;br /&gt;
** &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; – rege;&lt;br /&gt;
** &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; – regină;&lt;br /&gt;
** &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; – nebun;&lt;br /&gt;
** &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; – tură;&lt;br /&gt;
** &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; – cal;&lt;br /&gt;
* Piesele de pe tablă atacă astfel:&lt;br /&gt;
** regele atacă oricare dintre cele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; căsuțe vecine pe linie, coloană sau diagonale, situate pe tablă;&lt;br /&gt;
** pionul atacă oricare dintre cele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; căsuțe vecine pe diagonale, situate pe tablă;&lt;br /&gt;
** calul atacă oricare dintre &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; căsuțe, situate pe tablă, în care poate ajunge sărind în &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;;&lt;br /&gt;
** regina atacă orice căsuță de pe tablă aflată pe aceeași linie, coloană sau diagonală cu ea, dar până la întâlnirea altei piese;&lt;br /&gt;
** nebunul atacă orice căsuță de pe tablă aflată pe aceeași diagonală cu el, dar până la întâlnirea altei piese;&lt;br /&gt;
** tura atacă orice căsuță de pe tablă aflată pe aceeași linie sau coloană cu ea, dar până la întâlnirea altei piese;&lt;br /&gt;
&lt;br /&gt;
= Exemplu =&lt;br /&gt;
&amp;lt;code&amp;gt;piesesah.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 6 10&lt;br /&gt;
 p 1 1&lt;br /&gt;
 r 8 9&lt;br /&gt;
 q 3 2&lt;br /&gt;
 n 6 7&lt;br /&gt;
 t 2 9&lt;br /&gt;
 c 9 3&lt;br /&gt;
 1 1&lt;br /&gt;
 5 5&lt;br /&gt;
 2 3&lt;br /&gt;
 5 2&lt;br /&gt;
 9 6&lt;br /&gt;
 8 9&lt;br /&gt;
 10 10&lt;br /&gt;
 9 2&lt;br /&gt;
 2 2&lt;br /&gt;
 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;piesesah.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Tabla de șah arată astfel:&lt;br /&gt;
 2 1 0 1 0 0 0 0 1 0 &lt;br /&gt;
 1 1 1 1 1 1 1 1 2 1 &lt;br /&gt;
 1 2 1 1 1 1 1 1 1 1 &lt;br /&gt;
 1 1 1 0 1 0 0 0 1 0 &lt;br /&gt;
 0 1 0 1 0 1 0 1 1 0 &lt;br /&gt;
 0 1 0 0 1 0 2 0 1 0 &lt;br /&gt;
 0 1 0 1 0 1 0 1 1 1 &lt;br /&gt;
 1 1 0 0 1 0 1 1 2 1 &lt;br /&gt;
 0 1 2 1 0 0 0 1 1 1 &lt;br /&gt;
 1 1 1 0 1 0 0 0 1 0&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def attack_positions_pawn(x, y, color, n):&lt;br /&gt;
    attacks = []&lt;br /&gt;
    if color == &#039;white&#039;:&lt;br /&gt;
        if x &amp;gt; 0 and y &amp;gt; 0:&lt;br /&gt;
            attacks.append((x - 1, y - 1))&lt;br /&gt;
        if x &amp;gt; 0 and y &amp;lt; n - 1:&lt;br /&gt;
            attacks.append((x - 1, y + 1))&lt;br /&gt;
    else:  # black&lt;br /&gt;
        if x &amp;lt; n - 1 and y &amp;gt; 0:&lt;br /&gt;
            attacks.append((x + 1, y - 1))&lt;br /&gt;
        if x &amp;lt; n - 1 and y &amp;lt; n - 1:&lt;br /&gt;
            attacks.append((x + 1, y + 1))&lt;br /&gt;
    return attacks&lt;br /&gt;
&lt;br /&gt;
def attack_positions_king(x, y, n):&lt;br /&gt;
    attacks = []&lt;br /&gt;
    for dx in range(-1, 2):&lt;br /&gt;
        for dy in range(-1, 2):&lt;br /&gt;
            if dx == 0 and dy == 0:&lt;br /&gt;
                continue&lt;br /&gt;
            if 0 &amp;lt;= x + dx &amp;lt; n and 0 &amp;lt;= y + dy &amp;lt; n:&lt;br /&gt;
                attacks.append((x + dx, y + dy))&lt;br /&gt;
    return attacks&lt;br /&gt;
&lt;br /&gt;
def attack_positions_knight(x, y, n):&lt;br /&gt;
    moves = [(2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2), (2, -1)]&lt;br /&gt;
    attacks = []&lt;br /&gt;
    for dx, dy in moves:&lt;br /&gt;
        if 0 &amp;lt;= x + dx &amp;lt; n and 0 &amp;lt;= y + dy &amp;lt; n:&lt;br /&gt;
            attacks.append((x + dx, y + dy))&lt;br /&gt;
    return attacks&lt;br /&gt;
&lt;br /&gt;
def attack_positions_bishop(x, y, n):&lt;br /&gt;
    attacks = []&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if 0 &amp;lt;= x + i &amp;lt; n and 0 &amp;lt;= y + i &amp;lt; n:&lt;br /&gt;
            attacks.append((x + i, y + i))&lt;br /&gt;
        if 0 &amp;lt;= x - i &amp;lt; n and 0 &amp;lt;= y + i &amp;lt; n:&lt;br /&gt;
            attacks.append((x - i, y + i))&lt;br /&gt;
        if 0 &amp;lt;= x + i &amp;lt; n and 0 &amp;lt;= y - i &amp;lt; n:&lt;br /&gt;
            attacks.append((x + i, y - i))&lt;br /&gt;
        if 0 &amp;lt;= x - i &amp;lt; n and 0 &amp;lt;= y - i &amp;lt; n:&lt;br /&gt;
            attacks.append((x - i, y - i))&lt;br /&gt;
    return attacks&lt;br /&gt;
&lt;br /&gt;
def attack_positions_rook(x, y, n):&lt;br /&gt;
    attacks = []&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if 0 &amp;lt;= x + i &amp;lt; n:&lt;br /&gt;
            attacks.append((x + i, y))&lt;br /&gt;
        if 0 &amp;lt;= x - i &amp;lt; n:&lt;br /&gt;
            attacks.append((x - i, y))&lt;br /&gt;
        if 0 &amp;lt;= y + i &amp;lt; n:&lt;br /&gt;
            attacks.append((x, y + i))&lt;br /&gt;
        if 0 &amp;lt;= y - i &amp;lt; n:&lt;br /&gt;
            attacks.append((x, y - i))&lt;br /&gt;
    return attacks&lt;br /&gt;
&lt;br /&gt;
def attack_positions_queen(x, y, n):&lt;br /&gt;
    return attack_positions_bishop(x, y, n) + attack_positions_rook(x, y, n)&lt;br /&gt;
&lt;br /&gt;
def is_attacked(board, x, y):&lt;br /&gt;
    return board[x][y] == 1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea dimensiunii tablei de șah&lt;br /&gt;
    n = int(input().strip())&lt;br /&gt;
    &lt;br /&gt;
    # Citirea numărului de piese&lt;br /&gt;
    m = int(input().strip())&lt;br /&gt;
    &lt;br /&gt;
    # Inițializarea tablei de șah&lt;br /&gt;
    board = [[0] * n for _ in range(n)]&lt;br /&gt;
    &lt;br /&gt;
    # Citirea pieselor și plasarea lor pe tabla de șah&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        piece_info = input().strip().split()&lt;br /&gt;
        piece_type = piece_info[0]&lt;br /&gt;
        x = int(piece_info[1]) - 1  # Transformare la index 0&lt;br /&gt;
        y = int(piece_info[2]) - 1  # Transformare la index 0&lt;br /&gt;
        color = piece_info[3] if len(piece_info) &amp;gt; 3 else None  # doar pentru pion&lt;br /&gt;
        &lt;br /&gt;
        # Marcare poziție ocupată&lt;br /&gt;
        board[x][y] = 2&lt;br /&gt;
        &lt;br /&gt;
        # Obținerea pozițiilor atacate&lt;br /&gt;
        if piece_type == &amp;quot;pion&amp;quot;:&lt;br /&gt;
            attacks = attack_positions_pawn(x, y, color, n)&lt;br /&gt;
        elif piece_type == &amp;quot;rege&amp;quot;:&lt;br /&gt;
            attacks = attack_positions_king(x, y, n)&lt;br /&gt;
        elif piece_type == &amp;quot;regina&amp;quot;:&lt;br /&gt;
            attacks = attack_positions_queen(x, y, n)&lt;br /&gt;
        elif piece_type == &amp;quot;nebun&amp;quot;:&lt;br /&gt;
            attacks = attack_positions_bishop(x, y, n)&lt;br /&gt;
        elif piece_type == &amp;quot;tura&amp;quot;:&lt;br /&gt;
            attacks = attack_positions_rook(x, y, n)&lt;br /&gt;
        elif piece_type == &amp;quot;cal&amp;quot;:&lt;br /&gt;
            attacks = attack_positions_knight(x, y, n)&lt;br /&gt;
        &lt;br /&gt;
        # Marcare poziții atacate&lt;br /&gt;
        for ax, ay in attacks:&lt;br /&gt;
            board[ax][ay] = max(board[ax][ay], 1)&lt;br /&gt;
    &lt;br /&gt;
    # Citirea coordonatelor ce trebuiesc verificate&lt;br /&gt;
    t = int(input().strip())&lt;br /&gt;
    for _ in range(t):&lt;br /&gt;
        x, y = map(int, input().strip().split())&lt;br /&gt;
        x -= 1  # Transformare la index 0&lt;br /&gt;
        y -= 1  # Transformare la index 0&lt;br /&gt;
        &lt;br /&gt;
        if board[x][y] == 2:&lt;br /&gt;
            print(&amp;quot;ocupata&amp;quot;)&lt;br /&gt;
        elif board[x][y] == 1:&lt;br /&gt;
            print(&amp;quot;atacata&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;neatacata&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3972_-_Wall&amp;diff=10203</id>
		<title>3972 - Wall</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3972_-_Wall&amp;diff=10203"/>
		<updated>2024-07-31T05:48:51Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: = Cerința = Se dă un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Să se afle numărul de subsecvențe ale șirului pentru care diferența dintre elementul lor de valoare maximă și cel de valoare minimă este mai mică sau egală decât un număr întreg &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; dat.  = Date de intrare = Programul citește de la tastatură numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi, separate prin spații.  = Date de ieșire = Programul va afișa...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Să se afle numărul de subsecvențe ale șirului pentru care diferența dintre elementul lor de valoare maximă și cel de valoare minimă este mai mică sau egală decât un număr întreg &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; dat.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul de subsecvențe ale șirului dat care respectă condiția din enunț.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ T ≤ 2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere citite vor fi din intervalul &amp;lt;code&amp;gt;[-1.000.000.000, 1.000.000.000]&amp;lt;/code&amp;gt;&lt;br /&gt;
* se numește subsecvență a unui șir o succesiune de elemente consecutive din acesta, considerate în ordinea în care apar în șir&lt;br /&gt;
* pentru teste în valoare de &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte &amp;lt;code&amp;gt;N ≤ 10.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru teste în valoare de &amp;lt;code&amp;gt;70&amp;lt;/code&amp;gt; de puncte &amp;lt;code&amp;gt;N ≤ 600.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&#039;&#039;&#039;Intrare&#039;&#039;&#039;&lt;br /&gt;
 5 2&lt;br /&gt;
 1 7 2 3 4&lt;br /&gt;
&#039;&#039;&#039;Ieșire&#039;&#039;&#039;&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; subsecvențe care respectă condiția din enunț sunt toate cele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; care conțin un singur element(diferența dintre elementul maxim și cel minim fiind astfel &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), respectiv cele delimitate de perechile de indecși &amp;lt;code&amp;gt;[3, 4], [3, 5], [4, 5]&amp;lt;/code&amp;gt;(șirul se consideră a fi indexat de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
def num_subsequences_with_condition(arr, N, T):&lt;br /&gt;
    min_deque = deque()&lt;br /&gt;
    max_deque = deque()&lt;br /&gt;
    start = 0&lt;br /&gt;
    count = 0&lt;br /&gt;
    &lt;br /&gt;
    for end in range(N):&lt;br /&gt;
        while min_deque and arr[min_deque[-1]] &amp;gt;= arr[end]:&lt;br /&gt;
            min_deque.pop()&lt;br /&gt;
        while max_deque and arr[max_deque[-1]] &amp;lt;= arr[end]:&lt;br /&gt;
            max_deque.pop()&lt;br /&gt;
        &lt;br /&gt;
        min_deque.append(end)&lt;br /&gt;
        max_deque.append(end)&lt;br /&gt;
        &lt;br /&gt;
        while arr[max_deque[0]] - arr[min_deque[0]] &amp;gt; T:&lt;br /&gt;
            start += 1&lt;br /&gt;
            if min_deque[0] &amp;lt; start:&lt;br /&gt;
                min_deque.popleft()&lt;br /&gt;
            if max_deque[0] &amp;lt; start:&lt;br /&gt;
                max_deque.popleft()&lt;br /&gt;
        &lt;br /&gt;
        count += (end - start + 1)&lt;br /&gt;
    &lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
N = int(input())&lt;br /&gt;
arr = list(map(int, input().split()))&lt;br /&gt;
T = int(input())&lt;br /&gt;
&lt;br /&gt;
# Calcularea și afișarea rezultatului&lt;br /&gt;
result = num_subsequences_with_condition(arr, N, T)&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0726_-_Acoperire_1&amp;diff=10202</id>
		<title>0726 - Acoperire 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0726_-_Acoperire_1&amp;diff=10202"/>
		<updated>2024-07-31T05:47:36Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Dintr-o suprafaţă pătrată cu latura de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; unităţi care este formată din &amp;lt;code&amp;gt;N*N&amp;lt;/code&amp;gt; pătrăţele cu latura de o unitate se decupează cele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; pătrăţele din colţuri.  = Cerința = Determinaţi o modalitate de a acoperi suprafaţa în întregime cu piese de arie &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; unităţi care au forma următoare:  Piesele pot fi si rotite sau întoarse putând astfel să folosim toate cele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; moduri de a le aşeza.  = Date de i...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dintr-o suprafaţă pătrată cu latura de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; unităţi care este formată din &amp;lt;code&amp;gt;N*N&amp;lt;/code&amp;gt; pătrăţele cu latura de o unitate se decupează cele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; pătrăţele din colţuri.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinaţi o modalitate de a acoperi suprafaţa în întregime cu piese de arie &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; unităţi care au forma următoare:&lt;br /&gt;
&lt;br /&gt;
Piesele pot fi si rotite sau întoarse putând astfel să folosim toate cele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; moduri de a le aşeza.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;acoperire1.in&amp;lt;/code&amp;gt; conține pe prima linie un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, cu semnificaţia din enunţ.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;acoperire1.out&amp;lt;/code&amp;gt; va conține valoarea &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; pe prima linie dacă problema nu are soluţie, iar în caz contrar va avea următoarea structură: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii cu câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; valori fiecare reprezentând codificarea suprafeţei. Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu. Poziţiile ocupate de prima piesă aşezată se vor codifica cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, poziţiile ocupate de a doua piesă aşezată se vor codifica cu &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; etc. Corespunzător colţurilor lipsă se va scrie valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;6 ≤ n ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* Piesele trebuie să fie complet în interiorul zonei;&lt;br /&gt;
* Zona trebuie acoperită integral;&lt;br /&gt;
* Două piese nu se pot suprapune complet sau parţial;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;acoperire1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&amp;lt;code&amp;gt;acoperire1.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 7 2 2 2 0 &lt;br /&gt;
 3 7 2 4 4 4 &lt;br /&gt;
 3 7 7 4 5 5 &lt;br /&gt;
 3 3 6 1 1 5 &lt;br /&gt;
 6 6 6 8 1 5 &lt;br /&gt;
 0 8 8 8 1 0&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def place_l_tiles(board, n, top_left_row, top_left_col):&lt;br /&gt;
    # n - dimension of the current board (n x n)&lt;br /&gt;
    if n == 2:&lt;br /&gt;
        # Base case: only one tile can fit, as 4 cells are considered and one corner is missing&lt;br /&gt;
        for i in range(2):&lt;br /&gt;
            for j in range(2):&lt;br /&gt;
                if board[top_left_row + i][top_left_col + j] == 0:&lt;br /&gt;
                    board[top_left_row + i][top_left_col + j] = 1&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    half = n // 2&lt;br /&gt;
    # Find the center tile to place the L-shaped tromino around&lt;br /&gt;
    # (middle of the top-left, top-right, bottom-left, bottom-right quarters)&lt;br /&gt;
    center_r, center_c = top_left_row + half - 1, top_left_col + half - 1&lt;br /&gt;
&lt;br /&gt;
    # Determine which quadrant is missing the corner cell&lt;br /&gt;
    if board[top_left_row][top_left_col] == -1:&lt;br /&gt;
        missing_quad = 0&lt;br /&gt;
    elif board[top_left_row][top_left_col + n - 1] == -1:&lt;br /&gt;
        missing_quad = 1&lt;br /&gt;
    elif board[top_left_row + n - 1][top_left_col] == -1:&lt;br /&gt;
        missing_quad = 2&lt;br /&gt;
    elif board[top_left_row + n - 1][top_left_col + n - 1] == -1:&lt;br /&gt;
        missing_quad = 3&lt;br /&gt;
    &lt;br /&gt;
    # Fill the center of the current board with a L-shaped tromino&lt;br /&gt;
    tiles = [(center_r, center_c), (center_r, center_c + 1), (center_r + 1, center_c), (center_r + 1, center_c + 1)]&lt;br /&gt;
    # We have four quadrants (0: top-left, 1: top-right, 2: bottom-left, 3: bottom-right)&lt;br /&gt;
    for idx, (i, j) in enumerate(tiles):&lt;br /&gt;
        if idx != missing_quad:&lt;br /&gt;
            board[i][j] = 1&lt;br /&gt;
&lt;br /&gt;
    # Recursively fill each of the four quadrants&lt;br /&gt;
    # Top-left quadrant&lt;br /&gt;
    place_l_tiles(board, half, top_left_row, top_left_col)&lt;br /&gt;
    # Top-right quadrant&lt;br /&gt;
    place_l_tiles(board, half, top_left_row, top_left_col + half)&lt;br /&gt;
    # Bottom-left quadrant&lt;br /&gt;
    place_l_tiles(board, half, top_left_row + half, top_left_col)&lt;br /&gt;
    # Bottom-right quadrant&lt;br /&gt;
    place_l_tiles(board, half, top_left_row + half, top_left_col + half)&lt;br /&gt;
&lt;br /&gt;
# Initialize the board&lt;br /&gt;
N = 4 # Example value, should be a power of 2&lt;br /&gt;
board = [[0 for _ in range(N)] for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
# Remove corners&lt;br /&gt;
board[0][0] = -1&lt;br /&gt;
board[0][N-1] = -1&lt;br /&gt;
board[N-1][0] = -1&lt;br /&gt;
board[N-1][N-1] = -1&lt;br /&gt;
&lt;br /&gt;
# Place L-shaped tiles starting from the top-left corner of the board&lt;br /&gt;
place_l_tiles(board, N, 0, 0)&lt;br /&gt;
&lt;br /&gt;
# Print the board&lt;br /&gt;
for row in board:&lt;br /&gt;
    print(&#039; &#039;.join(str(cell) for cell in row))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4128_-_Iluminat&amp;diff=10201</id>
		<title>4128 - Iluminat</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4128_-_Iluminat&amp;diff=10201"/>
		<updated>2024-07-31T05:46:06Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Primarul orașului X dorește să aibă un iluminat public modern. Pentru aceasta, realizează o schiță sub forma unui pătrat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane în care fiecare element situat la intersecția unei linii cu o coloană reprezintă un cartier.  Primarul a calculat pentru fiecare cartier care este numărul de stâlpi de iluminat public din acel cartier. Fiecare stâlp are un singur bec care inițial este aprins. Acesta a observat un lucru inter...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Primarul orașului X dorește să aibă un iluminat public modern. Pentru aceasta, realizează o schiță sub forma unui pătrat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane în care fiecare element situat la intersecția unei linii cu o coloană reprezintă un cartier.&lt;br /&gt;
&lt;br /&gt;
Primarul a calculat pentru fiecare cartier care este numărul de stâlpi de iluminat public din acel cartier. Fiecare stâlp are un singur bec care inițial este aprins. Acesta a observat un lucru interesant: toate cartierele au un număr diferit de stâlpi de iluminare, iar valoarea maximă a numărului de stâlpi dintr-un cartier este &amp;lt;code&amp;gt;n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru a fi realizată într-un mod cât mai eficient, stingerea becurilor se realizează în următorul mod:&lt;br /&gt;
&lt;br /&gt;
* în prima etapă se sting becurile din cartierul cu număr maxim de stâlpi de iluminat, ceea ce duce la stingerea becurilor din cartierele de pe aceeași linie precum și din cele pe aceeași coloană cu cartierul cu număr maxim de stâlpi.&lt;br /&gt;
* procedeul se reia la fiecare etapă pentru toate cartierele în care nu au fost stinse becurile, până când rămâne un singur cartier iluminat.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând numerele naturale nenule &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, precum și numărul de stâlpi de iluminat din fiecare cartier, să se determine:&lt;br /&gt;
&lt;br /&gt;
* Câți stâlpi de iluminat se află în cartierul cu număr maxim de stâlpi de iluminat la etapa cu numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; din procedeul de stingere a becurilor?&lt;br /&gt;
* Câte becuri se sting, în total, la etapa cu numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;?&lt;br /&gt;
* Care este numărul maxim de becuri aprinse într-o zonă pătratică a orașului de dimensiune &amp;lt;code&amp;gt;k x k&amp;lt;/code&amp;gt;, înainte de a începe stingerea becurilor?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;iluminat.in&amp;lt;/code&amp;gt; conține pe prima linie o cifră &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;), reprezentând cerința cerută. Pe linia următoare se găsesc două numere naturale nenule &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, separate printr-un spațiu. Pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii se află &amp;lt;code&amp;gt;n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; numere naturale distincte, câte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pe fiecare linie, separate prin câte un spațiu, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul de ieșire &amp;lt;code&amp;gt;iluminat.out&amp;lt;/code&amp;gt; se va afișa răspunsul în funcție de cerință:&lt;br /&gt;
&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;c = 1&amp;lt;/code&amp;gt; se va afișa pe prima linie un singur număr reprezentând numărul de stâlpi de iluminat din cartierul cu număr maxim de stâlpi de iluminat la etapa &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;c = 2&amp;lt;/code&amp;gt; se va afișa pe prima linie un singur număr reprezentând câte becuri se sting, în total, la etapa cu numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;c = 3&amp;lt;/code&amp;gt; se va afișa numărul maxim de becuri aprinse într-o zonă pătratică de dimensiune &amp;lt;code&amp;gt;k x k&amp;lt;/code&amp;gt; înainte de stingerea becurilor&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;c ∈ {1, 2, 3}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k &amp;lt; n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Numărul de becuri din fiecare cartier este mai mic sau egal cu &amp;lt;code&amp;gt;n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;iluminat.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 4 2&lt;br /&gt;
 1 2 3 4&lt;br /&gt;
 16 13 5 6&lt;br /&gt;
 12 9 7 14&lt;br /&gt;
 10 11 8 15&lt;br /&gt;
&amp;lt;code&amp;gt;iluminat.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 15&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cerința este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Se sting becurile din cartierul având &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; stâlpi de iluminat, ceea ce duce la stingerea becurilor de pe stâlpii din linia &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și din coloana &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Tabloul devine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0  2  3  4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0  0  0  0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0  9  7 14&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 11  8 15&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La etapa a doua, primul cartier în care se sting becurile are &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; stâlpi de iluminat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def generate_matrix(n):&lt;br /&gt;
    return np.arange(1, n*n + 1).reshape(n, n)&lt;br /&gt;
&lt;br /&gt;
def find_max_and_sting(matrix):&lt;br /&gt;
    max_value = np.max(matrix)&lt;br /&gt;
    max_index = np.unravel_index(np.argmax(matrix, axis=None), matrix.shape)&lt;br /&gt;
    row, col = max_index&lt;br /&gt;
    matrix[row, :] = 0&lt;br /&gt;
    matrix[:, col] = 0&lt;br /&gt;
    return max_value, np.count_nonzero(matrix == 0)&lt;br /&gt;
&lt;br /&gt;
def max_bulbs_in_kxk(matrix, k):&lt;br /&gt;
    max_sum = 0&lt;br /&gt;
    for i in range(matrix.shape[0] - k + 1):&lt;br /&gt;
        for j in range(matrix.shape[1] - k + 1):&lt;br /&gt;
            submatrix_sum = np.sum(matrix[i:i+k, j:j+k])&lt;br /&gt;
            if submatrix_sum &amp;gt; max_sum:&lt;br /&gt;
                max_sum = submatrix_sum&lt;br /&gt;
    return max_sum&lt;br /&gt;
&lt;br /&gt;
def stage_results(n, k):&lt;br /&gt;
    matrix = generate_matrix(n)&lt;br /&gt;
    original_matrix = matrix.copy()&lt;br /&gt;
    &lt;br /&gt;
    max_value_at_k = 0&lt;br /&gt;
    total_sting_at_k = 0&lt;br /&gt;
    &lt;br /&gt;
    for stage in range(1, k + 1):&lt;br /&gt;
        max_value, sting_count = find_max_and_sting(matrix)&lt;br /&gt;
        if stage == k:&lt;br /&gt;
            max_value_at_k = max_value&lt;br /&gt;
            total_sting_at_k = sting_count&lt;br /&gt;
&lt;br /&gt;
    max_in_kxk_before_sting = max_bulbs_in_kxk(original_matrix, k)&lt;br /&gt;
    &lt;br /&gt;
    return max_value_at_k, total_sting_at_k, max_in_kxk_before_sting&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
n = int(input())&lt;br /&gt;
k = int(input())&lt;br /&gt;
&lt;br /&gt;
# Calcularea și afișarea rezultatelor&lt;br /&gt;
max_value_at_k, total_sting_at_k, max_in_kxk_before_sting = stage_results(n, k)&lt;br /&gt;
&lt;br /&gt;
print(max_value_at_k)&lt;br /&gt;
print(total_sting_at_k)&lt;br /&gt;
print(max_in_kxk_before_sting)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3651_-_Ghem&amp;diff=10200</id>
		<title>3651 - Ghem</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3651_-_Ghem&amp;diff=10200"/>
		<updated>2024-07-31T05:44:04Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră un tablou cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; coloane ce conține numerele naturale de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; așezate consecutiv, întâi pe linii și apoi pe coloane, începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în colțul din stânga sus, conform exemplului alăturat (&amp;lt;code&amp;gt;N = 4&amp;lt;/code&amp;gt;).  Dacă se derulează elemente tabloului, asemănător cu un ghem, prin rotirea tabloului în jurul centrului (intersecția diagonalelor), trăgând de unul...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră un tablou cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; coloane ce conține numerele naturale de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; așezate consecutiv, întâi pe linii și apoi pe coloane, începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în colțul din stânga sus, conform exemplului alăturat (&amp;lt;code&amp;gt;N = 4&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Dacă se derulează elemente tabloului, asemănător cu un ghem, prin rotirea tabloului în jurul centrului (intersecția diagonalelor), trăgând de unul din colțurile sale pe orizontală sau pe verticală, către exterior, se obține un șir cu numerele de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, într-o anumită ordine.&lt;br /&gt;
&lt;br /&gt;
Exemple: dacă &amp;lt;code&amp;gt;N = 4&amp;lt;/code&amp;gt; și se va trage de:&lt;br /&gt;
&lt;br /&gt;
* colțul din stânga sus – pe orizontală, se va obține șirul: &amp;lt;code&amp;gt;1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10&amp;lt;/code&amp;gt;;&lt;br /&gt;
* colțul din dreapta jos – pe verticală, se va obține șirul: &amp;lt;code&amp;gt;16 12 8 4 3 2 1 5 9 13 14 15 11 7 6 10&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se scrie un program care citește:&lt;br /&gt;
&lt;br /&gt;
* un numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, ce reprezintă numărul de linii și de coloane al unui tablou ce conține numerele naturale de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
* două numere naturale &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, ce reprezintă coordonatele colțului de unde se face derularea: { &amp;lt;code&amp;gt;(1,1) – stânga sus&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;(1,N) – dreapta sus&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;(N,N) – dreapta jos&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;(N,1) – stânga jos;&amp;lt;/code&amp;gt;}&lt;br /&gt;
* un caracter &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; (majusculă), ce reprezintă direcția pe care se face tragerea (&amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; – orizontală și &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; – verticală).&lt;br /&gt;
&lt;br /&gt;
și afișează șirul de numere ce rezultă din desfășurarea tabloului, începând cu colțul de unde se face tragerea și pe&lt;br /&gt;
&lt;br /&gt;
direcția de tragere.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;ghem.in&amp;lt;/code&amp;gt; conţine pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, pe a doua linie două numere naturale &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; despărțite printr-un spațiu, iar pe a treia linie caracterul &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, având semnificația de mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;ghem.out&amp;lt;/code&amp;gt; va conţine pe primul rând șirul de numere obținut prin desfășurarea tabloului.&lt;br /&gt;
&lt;br /&gt;
Între oricare două numere succesive va exista un singur spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N ≤ 500&amp;lt;/code&amp;gt;• &amp;lt;code&amp;gt;(X,Y)&amp;lt;/code&amp;gt; aparține mulțimii &amp;lt;code&amp;gt;{(1,1), (1,N), (N,N), (N,1)}&amp;lt;/code&amp;gt;; • &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; aparține mulțimii &amp;lt;code&amp;gt;{’O’,’V’}&amp;lt;/code&amp;gt; – majuscule;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;ghem.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 1 1&lt;br /&gt;
 O&lt;br /&gt;
&amp;lt;code&amp;gt;ghem.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Matricea alăturată se desfășoară “trăgând” de colțul din stânga sus în direcție orizontală obținându-se șirul: &amp;lt;code&amp;gt;1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def generate_matrix(N):&lt;br /&gt;
    matrix = []&lt;br /&gt;
    num = 1&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        row = []&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            row.append(num)&lt;br /&gt;
            num += 1&lt;br /&gt;
        matrix.append(row)&lt;br /&gt;
    return matrix&lt;br /&gt;
&lt;br /&gt;
def spiral_from_top_left(matrix, N):&lt;br /&gt;
    result = []&lt;br /&gt;
    top, left, bottom, right = 0, 0, N - 1, N - 1&lt;br /&gt;
    while top &amp;lt;= bottom and left &amp;lt;= right:&lt;br /&gt;
        for i in range(left, right + 1):&lt;br /&gt;
            result.append(matrix[top][i])&lt;br /&gt;
        top += 1&lt;br /&gt;
        for i in range(top, bottom + 1):&lt;br /&gt;
            result.append(matrix[i][right])&lt;br /&gt;
        right -= 1&lt;br /&gt;
        if top &amp;lt;= bottom:&lt;br /&gt;
            for i in range(right, left - 1, -1):&lt;br /&gt;
                result.append(matrix[bottom][i])&lt;br /&gt;
            bottom -= 1&lt;br /&gt;
        if left &amp;lt;= right:&lt;br /&gt;
            for i in range(bottom, top - 1, -1):&lt;br /&gt;
                result.append(matrix[i][left])&lt;br /&gt;
            left += 1&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def spiral_from_bottom_right(matrix, N):&lt;br /&gt;
    result = []&lt;br /&gt;
    bottom, right, top, left = N - 1, N - 1, 0, 0&lt;br /&gt;
    while bottom &amp;gt;= top and right &amp;gt;= left:&lt;br /&gt;
        for i in range(right, left - 1, -1):&lt;br /&gt;
            result.append(matrix[bottom][i])&lt;br /&gt;
        bottom -= 1&lt;br /&gt;
        for i in range(bottom, top - 1, -1):&lt;br /&gt;
            result.append(matrix[i][left])&lt;br /&gt;
        left += 1&lt;br /&gt;
        if bottom &amp;gt;= top:&lt;br /&gt;
            for i in range(left, right + 1):&lt;br /&gt;
                result.append(matrix[top][i])&lt;br /&gt;
            top += 1&lt;br /&gt;
        if right &amp;gt;= left:&lt;br /&gt;
            for i in range(top, bottom + 1):&lt;br /&gt;
                result.append(matrix[i][right])&lt;br /&gt;
            right -= 1&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def spiral_from_top_right(matrix, N):&lt;br /&gt;
    result = []&lt;br /&gt;
    top, right, bottom, left = 0, N - 1, N - 1, 0&lt;br /&gt;
    while top &amp;lt;= bottom and right &amp;gt;= left:&lt;br /&gt;
        for i in range(top, bottom + 1):&lt;br /&gt;
            result.append(matrix[i][right])&lt;br /&gt;
        right -= 1&lt;br /&gt;
        for i in range(right, left - 1, -1):&lt;br /&gt;
            result.append(matrix[bottom][i])&lt;br /&gt;
        bottom -= 1&lt;br /&gt;
        if right &amp;gt;= left:&lt;br /&gt;
            for i in range(bottom, top - 1, -1):&lt;br /&gt;
                result.append(matrix[i][left])&lt;br /&gt;
            left += 1&lt;br /&gt;
        if top &amp;lt;= bottom:&lt;br /&gt;
            for i in range(left, right + 1):&lt;br /&gt;
                result.append(matrix[top][i])&lt;br /&gt;
            top += 1&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def spiral_from_bottom_left(matrix, N):&lt;br /&gt;
    result = []&lt;br /&gt;
    bottom, left, top, right = N - 1, 0, 0, N - 1&lt;br /&gt;
    while bottom &amp;gt;= top and left &amp;lt;= right:&lt;br /&gt;
        for i in range(left, right + 1):&lt;br /&gt;
            result.append(matrix[bottom][i])&lt;br /&gt;
        bottom -= 1&lt;br /&gt;
        for i in range(bottom, top - 1, -1):&lt;br /&gt;
            result.append(matrix[i][right])&lt;br /&gt;
        right -= 1&lt;br /&gt;
        if left &amp;lt;= right:&lt;br /&gt;
            for i in range(right, left - 1, -1):&lt;br /&gt;
                result.append(matrix[top][i])&lt;br /&gt;
            top += 1&lt;br /&gt;
        if bottom &amp;gt;= top:&lt;br /&gt;
            for i in range(top, bottom + 1):&lt;br /&gt;
                result.append(matrix[i][left])&lt;br /&gt;
            left += 1&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def get_spiral_order(N, X, Y, D):&lt;br /&gt;
    matrix = generate_matrix(N)&lt;br /&gt;
    &lt;br /&gt;
    if (X, Y) == (1, 1):&lt;br /&gt;
        if D == &#039;O&#039;:&lt;br /&gt;
            return spiral_from_top_left(matrix, N)&lt;br /&gt;
        else:&lt;br /&gt;
            return spiral_from_bottom_left(matrix, N)[::-1]&lt;br /&gt;
    elif (X, Y) == (1, N):&lt;br /&gt;
        if D == &#039;O&#039;:&lt;br /&gt;
            return spiral_from_top_right(matrix, N)&lt;br /&gt;
        else:&lt;br /&gt;
            return spiral_from_top_left(matrix, N)[::-1]&lt;br /&gt;
    elif (X, Y) == (N, N):&lt;br /&gt;
        if D == &#039;O&#039;:&lt;br /&gt;
            return spiral_from_bottom_right(matrix, N)&lt;br /&gt;
        else:&lt;br /&gt;
            return spiral_from_top_right(matrix, N)[::-1]&lt;br /&gt;
    elif (X, Y) == (N, 1):&lt;br /&gt;
        if D == &#039;O&#039;:&lt;br /&gt;
            return spiral_from_bottom_left(matrix, N)&lt;br /&gt;
        else:&lt;br /&gt;
            return spiral_from_bottom_right(matrix, N)[::-1]&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
N = int(input())&lt;br /&gt;
X = int(input())&lt;br /&gt;
Y = int(input())&lt;br /&gt;
D = input().strip()&lt;br /&gt;
&lt;br /&gt;
# Generarea și afișarea șirului de numere&lt;br /&gt;
result = get_spiral_order(N, X, Y, D)&lt;br /&gt;
print(&amp;quot; &amp;quot;.join(map(str, result)))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1129_-_Tinta&amp;diff=10199</id>
		<title>1129 - Tinta</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1129_-_Tinta&amp;diff=10199"/>
		<updated>2024-07-30T15:08:26Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Alex are o pasiune pentru trasul la țintă. Jucându-se cu numere, visează la o nouă tablă pentru pasiunea sa. Tabla visată este de formă pătrată cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane, iar numerele, de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n * n&amp;lt;/code&amp;gt;,  le poziționează în țintă, ca în imaginea alăturată.  Alex, fiind un foarte bun țintaș, nu nimerește niciodată pe pătrățelele de pe contur. Când țintește o pătrățică din interior, el obține dre...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alex are o pasiune pentru trasul la țintă. Jucându-se cu numere, visează la o nouă tablă pentru pasiunea sa. Tabla visată este de formă pătrată cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane, iar numerele, de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n * n&amp;lt;/code&amp;gt;,  le poziționează în țintă, ca în imaginea alăturată.&lt;br /&gt;
&lt;br /&gt;
Alex, fiind un foarte bun țintaș, nu nimerește niciodată pe pătrățelele de pe contur. Când țintește o pătrățică din interior, el obține drept punctaj suma valorilor din cele opt pătrățele vecine.&lt;br /&gt;
&lt;br /&gt;
= Cerinţă =&lt;br /&gt;
Cunoscând n numărul de linii și de coloane ale țintei:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;a.&#039;&#039;&#039; Ajutați-l pe Alex să construiască ținta visată.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b.&#039;&#039;&#039; Câte punctaje distincte poate să obțină Alex dacă are o singură săgeată?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;c.&#039;&#039;&#039; Afișați punctajele distincte găsite.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;tinta.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, indicând numărul de linii și de coloane ale țintei.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;tinta.out&amp;lt;/code&amp;gt; va conține pe primele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, separate prin câte un spațiu, reprezentând numerele de pe cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii ale țintei. Pe linia &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; se va afișa un singur număr  &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; reprezentând  numărul de punctaje distincte. Pe linia &amp;lt;code&amp;gt;n+2&amp;lt;/code&amp;gt; se vor afișa &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; numere naturale separate prin câte un spațiu și ordonate strict crescător, reprezentând punctajele distincte.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru prima cerinţă afişată corect se va acorda 40% din punctaj; pentru a doua cerință se va acorda 20% din punctaj; pentru cea de-a treia cerință se va acorda 40% din punctaj.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;tinta.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;tinta.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1  2  6  &lt;br /&gt;
 3  5  7  &lt;br /&gt;
 4  8  9&lt;br /&gt;
 1&lt;br /&gt;
 40&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Alex poate ținti doar în pătrățelul interior (cel pe care avem &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;), deci obține un singur punctaj, iar suma este &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;tinta.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;code&amp;gt;tinta.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 2 6 7&lt;br /&gt;
 3 5 8 13&lt;br /&gt;
 4 9 12 14&lt;br /&gt;
 10 11 15 16&lt;br /&gt;
 3&lt;br /&gt;
 45 68 91&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Alex poate ținti doar pătrăţelele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def create_spiral_matrix(n):&lt;br /&gt;
    matrix = [[0] * n for _ in range(n)]&lt;br /&gt;
    num = 1&lt;br /&gt;
    left, right, top, bottom = 0, n - 1, 0, n - 1&lt;br /&gt;
&lt;br /&gt;
    while left &amp;lt;= right and top &amp;lt;= bottom:&lt;br /&gt;
        for i in range(left, right + 1):&lt;br /&gt;
            matrix[top][i] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
        top += 1&lt;br /&gt;
        for i in range(top, bottom + 1):&lt;br /&gt;
            matrix[i][right] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
        right -= 1&lt;br /&gt;
        for i in range(right, left - 1, -1):&lt;br /&gt;
            matrix[bottom][i] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
        bottom -= 1&lt;br /&gt;
        for i in range(bottom, top - 1, -1):&lt;br /&gt;
            matrix[i][left] = num&lt;br /&gt;
            num += 1&lt;br /&gt;
        left += 1&lt;br /&gt;
&lt;br /&gt;
    return matrix&lt;br /&gt;
&lt;br /&gt;
def calculate_scores(matrix, n):&lt;br /&gt;
    scores = set()&lt;br /&gt;
    for i in range(1, n - 1):&lt;br /&gt;
        for j in range(1, n - 1):&lt;br /&gt;
            score = (matrix[i - 1][j - 1] + matrix[i - 1][j] + matrix[i - 1][j + 1] +&lt;br /&gt;
                     matrix[i][j - 1] + matrix[i][j + 1] +&lt;br /&gt;
                     matrix[i + 1][j - 1] + matrix[i + 1][j] + matrix[i + 1][j + 1])&lt;br /&gt;
            scores.add(score)&lt;br /&gt;
    return scores&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceți valoarea lui n: &amp;quot;))&lt;br /&gt;
    spiral_matrix = create_spiral_matrix(n)&lt;br /&gt;
    &lt;br /&gt;
    print(&amp;quot;Matricea spirală:&amp;quot;)&lt;br /&gt;
    for row in spiral_matrix:&lt;br /&gt;
        print(&#039; &#039;.join(map(str, row)))&lt;br /&gt;
&lt;br /&gt;
    if n &amp;lt; 3:&lt;br /&gt;
        print(&amp;quot;Nu există pătrățele din interior pentru n &amp;lt; 3.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    scores = calculate_scores(spiral_matrix, n)&lt;br /&gt;
    print(f&amp;quot;Numărul de punctaje distincte: {len(scores)}&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Punctajele distincte sunt:&amp;quot;)&lt;br /&gt;
    for score in sorted(scores):&lt;br /&gt;
        print(score)&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3430_-_Bpj_2020&amp;diff=10198</id>
		<title>3430 - Bpj 2020</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3430_-_Bpj_2020&amp;diff=10198"/>
		<updated>2024-07-30T15:06:43Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Gigel a descoperit noul joc Block Puzzle Jewel. Jocul se desfășoară astfel:  * avem o tablă de joc sub forma unei matrice &amp;lt;code&amp;gt;8x8&amp;lt;/code&amp;gt;; * sunt &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; tipuri de piese care arată așa: * după ce Gigel adaugă o piesa, pătrățelele din care este formată piesa vor ocupa zonele corespunzătoare din tabla de joc iar, iar numărul de pătrățele din care este formată piesa se va adăuga la scorul lui Gigel. De exemplu,  dacă Gigel vrea să mute o piesă de t...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gigel a descoperit noul joc Block Puzzle Jewel. Jocul se desfășoară astfel:&lt;br /&gt;
&lt;br /&gt;
* avem o tablă de joc sub forma unei matrice &amp;lt;code&amp;gt;8x8&amp;lt;/code&amp;gt;;&lt;br /&gt;
* sunt &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; tipuri de piese care arată așa:&lt;br /&gt;
* după ce Gigel adaugă o piesa, pătrățelele din care este formată piesa vor ocupa zonele corespunzătoare din tabla de joc iar, iar numărul de pătrățele din care este formată piesa se va adăuga la scorul lui Gigel. De exemplu,  dacă Gigel vrea să mute o piesă de tipul &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; atunci ea va ocupa locurile &amp;lt;code&amp;gt;m[i][j]&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;m[i][j+1]&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;m[i][j+2]&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;m[i+1][j+2]&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m[i+2][j+2]&amp;lt;/code&amp;gt; iar scorul lui Gigel va crește cu &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; puncte sau dacă Gigel vrea să mute o piesă de tipul &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; atunci ea va ocupa locurile &amp;lt;code&amp;gt;m[i][j] , m[i][j+1] , m[i+1][j-1]&amp;lt;/code&amp;gt;  și &amp;lt;code&amp;gt;m[i+1][j]&amp;lt;/code&amp;gt; iar scorul lui Gigel va crește cu &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; puncte.&lt;br /&gt;
* dacă o linie sau o coloana este completată cu pătratele atunci ea se eliberează (se elimină pătrățelele care ocupă linia/coloana).&lt;br /&gt;
* modul de a pozitiona o piesă este așa : &amp;lt;code&amp;gt;a l c&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; este tipul piesei, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; reprezintă linia și coloana unde se va afla pătrățelul din stânga sus al piesei respective în matrice&lt;br /&gt;
* Dacă la o mutare se elimină:&lt;br /&gt;
** o linie sau o coloană , atunci Gigel primeste &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte&lt;br /&gt;
** &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; linii și coloane liberate, atunci Gigel primește &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte&lt;br /&gt;
** &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; linii și coloane eliberate, atunci Gigel primește &amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt; de puncte&lt;br /&gt;
** &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; linii și coloane eliberate, atunci Gigel primește &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; de puncte&lt;br /&gt;
** &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; linii și coloane eliberate, atunci Gigel primește &amp;lt;code&amp;gt;150&amp;lt;/code&amp;gt; de puncte&lt;br /&gt;
** &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; linii și coloane eliberate, atunci Gigel primește &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; de puncte&lt;br /&gt;
&lt;br /&gt;
Dându-se &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, numărul de piese pe care le va muta Gigel și piesele pe care le va muta Gigel (folosind numerele &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;), să se determine scorul final al lui Gigel.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;bpj2020.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;a l c&amp;lt;/code&amp;gt; cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;bpj2020.out&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, reprezentând scorul final al lui Gigel.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 50&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ l , c ≤ 8&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a ≤ 17&amp;lt;/code&amp;gt;&lt;br /&gt;
* nu o să existe o piesa suprapusă peste alta și nici piese care să iasă din tabla de joc&lt;br /&gt;
* la început tabla de joc este goală&lt;br /&gt;
&lt;br /&gt;
= Exemplu =&lt;br /&gt;
&amp;lt;code&amp;gt;bpj2020.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
 17 7 1&lt;br /&gt;
 5 8 4&lt;br /&gt;
 3 7 2&lt;br /&gt;
 10 5 5&lt;br /&gt;
 12 4 4&lt;br /&gt;
 1 6 4&lt;br /&gt;
 7 4 1&lt;br /&gt;
 6 5 6&lt;br /&gt;
 16 4 6&lt;br /&gt;
&amp;lt;code&amp;gt;bpj2020.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 108&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Definirea pieselor și pozițiilor lor relative&lt;br /&gt;
pieces = {&lt;br /&gt;
    1:  [(0, 0)],&lt;br /&gt;
    2:  [(0, 0), (0, 1)],&lt;br /&gt;
    3:  [(0, 0), (1, 0)],&lt;br /&gt;
    4:  [(0, 0), (0, 1), (1, 0)],&lt;br /&gt;
    5:  [(0, 0), (0, 1), (0, 2)],&lt;br /&gt;
    6:  [(0, 0), (1, 0), (2, 0)],&lt;br /&gt;
    7:  [(0, 0), (0, 1), (1, 1)],&lt;br /&gt;
    8:  [(0, 0), (1, 0), (1, 1)],&lt;br /&gt;
    9:  [(0, 0), (0, 1), (1, 0), (1, 1)],&lt;br /&gt;
    10: [(0, 0), (0, 1), (0, 2), (1, 0)],&lt;br /&gt;
    11: [(0, 0), (0, 1), (0, 2), (1, 2)],&lt;br /&gt;
    12: [(0, 0), (1, 0), (1, 1), (1, 2)],&lt;br /&gt;
    13: [(0, 0), (1, 0), (2, 0), (2, 1)],&lt;br /&gt;
    14: [(0, 0), (1, 0), (2, 0), (2, -1)],&lt;br /&gt;
    15: [(0, 0), (0, 1), (1, -1), (1, 0)],&lt;br /&gt;
    16: [(0, 0), (0, 1), (0, 2), (1, 2), (2, 2)],&lt;br /&gt;
    17: [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)],&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
def check_and_clear(board, n):&lt;br /&gt;
    cleared_lines = 0&lt;br /&gt;
    rows_to_clear = [i for i in range(n) if all(board[i][j] for j in range(n))]&lt;br /&gt;
    cols_to_clear = [j for j in range(n) if all(board[i][j] for i in range(n))]&lt;br /&gt;
&lt;br /&gt;
    for row in rows_to_clear:&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            board[row][j] = 0&lt;br /&gt;
        cleared_lines += 1&lt;br /&gt;
&lt;br /&gt;
    for col in cols_to_clear:&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            board[i][col] = 0&lt;br /&gt;
        cleared_lines += 1&lt;br /&gt;
&lt;br /&gt;
    score_bonus = [0, 10, 30, 60, 100, 150, 500]&lt;br /&gt;
    return cleared_lines, score_bonus[cleared_lines]&lt;br /&gt;
&lt;br /&gt;
def play_game(n, moves):&lt;br /&gt;
    board = [[0] * 8 for _ in range(8)]&lt;br /&gt;
    score = 0&lt;br /&gt;
&lt;br /&gt;
    for a, l, c in moves:&lt;br /&gt;
        for dx, dy in pieces[a]:&lt;br /&gt;
            x, y = l + dx - 1, c + dy - 1&lt;br /&gt;
            board[x][y] = 1&lt;br /&gt;
            score += 1&lt;br /&gt;
&lt;br /&gt;
        cleared_lines, bonus = check_and_clear(board, 8)&lt;br /&gt;
        score += bonus&lt;br /&gt;
&lt;br /&gt;
    return score&lt;br /&gt;
&lt;br /&gt;
# Citirea inputului&lt;br /&gt;
n = int(input())&lt;br /&gt;
moves = [tuple(map(int, input().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
# Calcularea scorului final&lt;br /&gt;
final_score = play_game(n, moves)&lt;br /&gt;
print(final_score)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4197_-_AB&amp;diff=10197</id>
		<title>4197 - AB</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4197_-_AB&amp;diff=10197"/>
		<updated>2024-07-30T15:03:46Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Alice tocmai s-a decis să-și impresioneze fratele mai mic, Bob, cu abilitățile sale de deducție matematică. Astfel, ea așează într-o matrice cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; coloane toate numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;N × M&amp;lt;/code&amp;gt;, astfel încât fiecare linie și respectiv fiecare coloană, să fie sortată strict crescător. O matrice cu aceste proprietăți se numește o &amp;#039;&amp;#039;&amp;#039;matrice AB&amp;#039;&amp;#039;&amp;#039;. Alice îi cere apoi lui Bob să elimine &amp;lt;co...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alice tocmai s-a decis să-și impresioneze fratele mai mic, Bob, cu abilitățile sale de deducție matematică. Astfel, ea așează într-o matrice cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; coloane toate numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;N × M&amp;lt;/code&amp;gt;, astfel încât fiecare linie și respectiv fiecare coloană, să fie sortată strict crescător. O matrice cu aceste proprietăți se numește o &#039;&#039;&#039;matrice AB&#039;&#039;&#039;. Alice îi cere apoi lui Bob să elimine &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; valori din matrice, care sa nu fie adiacente orizontal sau adiacente vertical. Apoi, ea va încerca să reintroducă aceste &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; valori în matrice astfel încât sa rămână o matrice AB. După câteva încercări, Alice realizează că, în anumite situații pot exista mai multe moduri de a aranja cele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere pe pozițiile libere.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care, cunoscând matricea AB inițială și &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; interogări, constând fiecare dintr-o listă de elemente eliminate din matrice, determină pentru fiecare interogare dacă există o soluție unică de a aranja elementele eliminate în matrice astfel încât aceasta să fie matrice AB.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Prima linie a datelor de intrare conține trei numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, separate prin câte un spațiu, având semnificația din enunț. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; valori, separate prin câte un spațiu, reprezentând matricea AB construită de Alice. Urmează apoi &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; interogări, fiecare interogare fiind descrisă pe două linii. Prima linie care descrie o interogare conține numărul natural &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, reprezentând numărul de valori eliminate de către Bob. Pe a doua linie din descrierea interogării se află cele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere eliminate, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Veți afișa &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii, fiecare reprezentând un număr întreg. Cea de a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a linie va conține răspunsul pentru a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a interogare: răspunsul va fi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; dacă există o soluție unică de a aranja elementele eliminate astfel încât să se obțină o matrice AB, respectiv &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; în caz contrar.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N, M ≤ 2.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 25&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;K ≥ 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se garantează că în orice interogare numerele eliminate sunt distincte și respectă condiția din enunț (nu sunt adiacente orizontal sau vertical).&lt;br /&gt;
* Numărul total al valorilor din interogări nu depășește &amp;lt;code&amp;gt;4.000.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Punctajul pentru un test va fi acordat doar dacă răspunsurile pentru toate interogările din testul respectiv sunt corecte.&lt;br /&gt;
* Datorită dimensiunilor mari ale datelor de intrare, doar unele teste au fost adăugate.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&#039;&#039;&#039;Intrare&#039;&#039;&#039;&lt;br /&gt;
 3 3 2&lt;br /&gt;
 1 2 4&lt;br /&gt;
 3 5 8&lt;br /&gt;
 6 7 9&lt;br /&gt;
 3&lt;br /&gt;
 1 5 9&lt;br /&gt;
 3&lt;br /&gt;
 5 4 6&lt;br /&gt;
&#039;&#039;&#039;Ieșire&#039;&#039;&#039;&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Prima interogare presupune eliminarea numerelor &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;, matricea după eliminare arătând astfel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;? 2 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;3 ? 8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;6 7 ?&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se observă că aranjarea celor trei numere este unică, obținându-se matricea originală.&lt;br /&gt;
&lt;br /&gt;
A doua interogare presupune eliminarea valorilor &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 2 ?&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;3 ? 8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;? 7 9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rearanjarea nu este unică, o soluție alternativă fiind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 2 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;3 6 8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4 7 9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def is_unique_solution(N, M, queries):&lt;br /&gt;
    results = []&lt;br /&gt;
    for query in queries:&lt;br /&gt;
        if len(query) == 0:&lt;br /&gt;
            results.append(&amp;quot;YES&amp;quot;)&lt;br /&gt;
            continue&lt;br /&gt;
        &lt;br /&gt;
        positions = [(val - 1) // M, (val - 1) % M for val in query]&lt;br /&gt;
        sorted_query = sorted(query)&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, len(sorted_query)):&lt;br /&gt;
            pos1 = positions[sorted_query[i-1] - 1]&lt;br /&gt;
            pos2 = positions[sorted_query[i] - 1]&lt;br /&gt;
            &lt;br /&gt;
            if pos1[0] == pos2[0] and pos1[1] + 1 == pos2[1]:&lt;br /&gt;
                results.append(&amp;quot;NO&amp;quot;)&lt;br /&gt;
                break&lt;br /&gt;
            if pos1[1] == pos2[1] and pos1[0] + 1 == pos2[0]:&lt;br /&gt;
                results.append(&amp;quot;NO&amp;quot;)&lt;br /&gt;
                break&lt;br /&gt;
        else:&lt;br /&gt;
            results.append(&amp;quot;YES&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
# Example usage:&lt;br /&gt;
N, M = 3, 3&lt;br /&gt;
queries = [&lt;br /&gt;
    [5, 7, 9],&lt;br /&gt;
    [1, 3, 6],&lt;br /&gt;
    [2, 4, 8]&lt;br /&gt;
]&lt;br /&gt;
print(is_unique_solution(N, M, queries))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4171_-_Loop_Over&amp;diff=10196</id>
		<title>4171 - Loop Over</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4171_-_Loop_Over&amp;diff=10196"/>
		<updated>2024-07-30T15:01:45Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Baxibilian în timp ce învață la informatică a descoperit jocul &amp;#039;&amp;#039;&amp;#039;Loopover&amp;#039;&amp;#039;&amp;#039;. Acest joc poate fi descris prin următoarele reguli:  * Jocul se desfășoară pe o tabelă pătratică de &amp;lt;code&amp;gt;n x n&amp;lt;/code&amp;gt; celule, în care atât rândurile cât și coloanele sunt numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;; * În starea inițială a tabelei, în fiecare celulă se află câte un număr de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n^2&amp;lt;/code&amp;gt;, astfel încât &amp;lt;code&amp;gt;M[i,j] = (i - 1) * n + j&amp;lt;/code&amp;gt; * As...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Baxibilian în timp ce învață la informatică a descoperit jocul &#039;&#039;&#039;Loopover&#039;&#039;&#039;. Acest joc poate fi descris prin următoarele reguli:&lt;br /&gt;
&lt;br /&gt;
* Jocul se desfășoară pe o tabelă pătratică de &amp;lt;code&amp;gt;n x n&amp;lt;/code&amp;gt; celule, în care atât rândurile cât și coloanele sunt numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;;&lt;br /&gt;
* În starea inițială a tabelei, în fiecare celulă se află câte un număr de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n^2&amp;lt;/code&amp;gt;, astfel încât &amp;lt;code&amp;gt;M[i,j] = (i - 1) * n + j&amp;lt;/code&amp;gt;&lt;br /&gt;
* Asupra tabelei se pot aplica patru tipuri de operații de oricâte ori:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;L x&amp;lt;/code&amp;gt; – Toate valorile din celulele de pe linia &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; se vor deplasa ciclic la stânga cu o unitate, adică &amp;lt;code&amp;gt;M[x,i] = M[x,i+1]&amp;lt;/code&amp;gt; pentru &amp;lt;code&amp;gt;i &amp;lt; n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M[x,n] = M[x,1]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;R x&amp;lt;/code&amp;gt; – Toate valorile din celulele de pe linia &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; se vor deplasa ciclic la dreapta cu o unitate, adică &amp;lt;code&amp;gt;M[x,i] = M[x,i-1]&amp;lt;/code&amp;gt; pentru &amp;lt;code&amp;gt;i &amp;gt; 1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M[x,1] = M[x,n]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;U x&amp;lt;/code&amp;gt; – Toate valorile din celulele de pe coloana &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; se vor deplasa ciclic în sus cu o unitate, adică &amp;lt;code&amp;gt;M[i,x] = M[i+1,x]&amp;lt;/code&amp;gt; pentru &amp;lt;code&amp;gt;i &amp;lt; n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M[n,x] = M[1,x]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;D x&amp;lt;/code&amp;gt; – Toate valorile din celulele de pe coloana &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; se vor deplasa ciclic în jos cu o unitate, adică &amp;lt;code&amp;gt;M[i,x] = M[i-1,x]&amp;lt;/code&amp;gt; pentru &amp;lt;code&amp;gt;i &amp;gt; 1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M[1,x] = M[n,x]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cum Baxibilian nu are timp să analizeze prea mult jocul Loopover, deoarece are de învățat, el dorește să știe următoarele lucruri:&lt;br /&gt;
&lt;br /&gt;
* Fiind dată starea unei tabele asupra căreia s-au făcut fie doar operații asupra liniilor, fie doar operații asupra coloanelor, care este numărul minim de operații pe care Baxibilian ar trebui să le aplice pentru a reveni în starea inițială?&lt;br /&gt;
* Fiind dată o secvență de &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; operații, care este numărul minim de aplicări ale acestei secvențe asupra unei tabele de dimensiune &amp;lt;code&amp;gt;n x n&amp;lt;/code&amp;gt; aflate în starea inițială astfel încât starea finală să fie aceeași ca starea inițială? Întrucât rezultatul poate fi un număr foarte mare, Baxibilian este mulțumit dacă află doar restul împărțirii acestui număr la &amp;lt;code&amp;gt;1.000.000.007&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
De pe prima linie a fișierului &amp;lt;code&amp;gt;loopover.in&amp;lt;/code&amp;gt; se vor afla două numere separate printr-un spațiu &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;  cerința care trebuie rezolvată și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; dimensiunea tabelei. În continuare:&lt;br /&gt;
&lt;br /&gt;
* Dacă &amp;lt;code&amp;gt;t = 1&amp;lt;/code&amp;gt;, pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii se vor afla, câte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere separate prin câte un spațiu, reprezentând configurația tabelei.&lt;br /&gt;
* Dacă &amp;lt;code&amp;gt;t = 2&amp;lt;/code&amp;gt;, pe ce-a de-a doua linie se va afla un singur număr &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se vor afla, separate prin câte un spațiu, un caracter &amp;lt;code&amp;gt;c&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;∈ {L,R,U,D}&amp;lt;/code&amp;gt; reprezentând tipul operației și un număr &amp;lt;code&amp;gt;x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; reprezentând indexul liniei sau coloanei asupra căreia se aplică operația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul &amp;lt;code&amp;gt;loopover.out&amp;lt;/code&amp;gt; se va afișa în funcție de cerință:&lt;br /&gt;
&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;t = 1&amp;lt;/code&amp;gt;, un singur număr reprezentând numărul minim de operații pentru a aduce tabela în starea inițială.&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;t = 2&amp;lt;/code&amp;gt;, un singur număr reprezentând restul împărțirii la &amp;lt;code&amp;gt;1.000.000.007&amp;lt;/code&amp;gt; al numărului minim de aplicări ale secvenței de operații asupra tabelei pentru ca aceasta să ajungă înapoi în starea inițială.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;t ∈ {1, 2}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;≤ n&amp;lt;/code&amp;gt; pentru orice &amp;lt;code&amp;gt;1 ≤ i ≤ m&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 4&lt;br /&gt;
 2 3 4 1&lt;br /&gt;
 8 5 6 7&lt;br /&gt;
 11 12 9 10&lt;br /&gt;
 13 14 15 16&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Operațiile ce trebuie aplicate sunt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;R 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;L 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;L 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;L 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 3&lt;br /&gt;
 7 8 6&lt;br /&gt;
 1 2 9&lt;br /&gt;
 4 5 3&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Operațiile ce trebuie aplicate sunt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;U 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;U 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;D 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 3: =&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3&lt;br /&gt;
 5&lt;br /&gt;
 U 1&lt;br /&gt;
 R 1&lt;br /&gt;
 U 2&lt;br /&gt;
 R 1&lt;br /&gt;
 L 2&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
După aplicarea secvenței de &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; operații, matricea obținută de Baxibilian este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 3 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;8 6 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 4 9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Numărul minim de aplicări ale secvenței pentru a ajunge la matricea identitate este &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 4: =&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 8&lt;br /&gt;
 10&lt;br /&gt;
 R 6&lt;br /&gt;
 L 8&lt;br /&gt;
 R 4&lt;br /&gt;
 U 3&lt;br /&gt;
 L 3&lt;br /&gt;
 L 1&lt;br /&gt;
 R 3&lt;br /&gt;
 U 5&lt;br /&gt;
 U 6&lt;br /&gt;
 U 3&lt;br /&gt;
&amp;lt;code&amp;gt;loopover.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4284&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Sunt necesare &amp;lt;code&amp;gt;4284&amp;lt;/code&amp;gt; de aplicări ale secvenței pentru a reveni în starea inițială.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def lcm(a, b):&lt;br /&gt;
    return a * b // gcd(a, b)&lt;br /&gt;
&lt;br /&gt;
def min_operations_to_initial(n, grid, is_row_operations):&lt;br /&gt;
    if is_row_operations:&lt;br /&gt;
        operations_needed = 0&lt;br /&gt;
        for row in grid:&lt;br /&gt;
            for j in range(n):&lt;br /&gt;
                if row[j] != (row[0] + j) % n:&lt;br /&gt;
                    shift_amount = (j - row.index(1)) % n&lt;br /&gt;
                    operations_needed = gcd(operations_needed, shift_amount)&lt;br /&gt;
        return operations_needed&lt;br /&gt;
    else:&lt;br /&gt;
        operations_needed = 0&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            col = [grid[i][j] for i in range(n)]&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                if col[i] != (col[0] + i * n) % (n * n):&lt;br /&gt;
                    shift_amount = (i - col.index(1)) % n&lt;br /&gt;
                    operations_needed = gcd(operations_needed, shift_amount)&lt;br /&gt;
        return operations_needed&lt;br /&gt;
&lt;br /&gt;
def min_apply_sequence(n, sequence):&lt;br /&gt;
    length_sequence = len(sequence)&lt;br /&gt;
    current_pos = list(range(n * n))&lt;br /&gt;
    for op in sequence:&lt;br /&gt;
        direction, idx = op.split()&lt;br /&gt;
        idx = int(idx) - 1&lt;br /&gt;
        if direction == &#039;L&#039;:&lt;br /&gt;
            row = current_pos[idx * n:(idx + 1) * n]&lt;br /&gt;
            current_pos[idx * n:(idx + 1) * n] = row[1:] + row[:1]&lt;br /&gt;
        elif direction == &#039;R&#039;:&lt;br /&gt;
            row = current_pos[idx * n:(idx + 1) * n]&lt;br /&gt;
            current_pos[idx * n:(idx + 1) * n] = row[-1:] + row[:-1]&lt;br /&gt;
        elif direction == &#039;U&#039;:&lt;br /&gt;
            col = current_pos[idx::n]&lt;br /&gt;
            current_pos[idx::n] = col[1:] + col[:1]&lt;br /&gt;
        elif direction == &#039;D&#039;:&lt;br /&gt;
            col = current_pos[idx::n]&lt;br /&gt;
            current_pos[idx::n] = col[-1:] + col[:-1]&lt;br /&gt;
    target_pos = list(range(n * n))&lt;br /&gt;
    if current_pos == target_pos:&lt;br /&gt;
        return 1&lt;br /&gt;
    cycle_length = 1&lt;br /&gt;
    while True:&lt;br /&gt;
        current_pos = list(range(n * n))&lt;br /&gt;
        for _ in range(cycle_length):&lt;br /&gt;
            for op in sequence:&lt;br /&gt;
                direction, idx = op.split()&lt;br /&gt;
                idx = int(idx) - 1&lt;br /&gt;
                if direction == &#039;L&#039;:&lt;br /&gt;
                    row = current_pos[idx * n:(idx + 1) * n]&lt;br /&gt;
                    current_pos[idx * n:(idx + 1) * n] = row[1:] + row[:1]&lt;br /&gt;
                elif direction == &#039;R&#039;:&lt;br /&gt;
                    row = current_pos[idx * n:(idx + 1) * n]&lt;br /&gt;
                    current_pos[idx * n:(idx + 1) * n] = row[-1:] + row[:-1]&lt;br /&gt;
                elif direction == &#039;U&#039;:&lt;br /&gt;
                    col = current_pos[idx::n]&lt;br /&gt;
                    current_pos[idx::n] = col[1:] + col[:1]&lt;br /&gt;
                elif direction == &#039;D&#039;:&lt;br /&gt;
                    col = current_pos[idx::n]&lt;br /&gt;
                    current_pos[idx::n] = col[-1:] + col[:-1]&lt;br /&gt;
        if current_pos == target_pos:&lt;br /&gt;
            return cycle_length % MOD&lt;br /&gt;
        cycle_length += 1&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
n = 4&lt;br /&gt;
grid = [&lt;br /&gt;
    [1, 2, 3, 4],&lt;br /&gt;
    [5, 6, 7, 8],&lt;br /&gt;
    [9, 10, 11, 12],&lt;br /&gt;
    [13, 14, 15, 16]&lt;br /&gt;
]&lt;br /&gt;
sequence = [&amp;quot;L 1&amp;quot;, &amp;quot;D 2&amp;quot;, &amp;quot;R 3&amp;quot;, &amp;quot;U 4&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
print(min_operations_to_initial(n, grid, True)) # Operații pe linii&lt;br /&gt;
print(min_operations_to_initial(n, grid, False)) # Operații pe coloane&lt;br /&gt;
print(min_apply_sequence(n, sequence))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4134_-_Raza_1&amp;diff=10195</id>
		<title>4134 - Raza 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4134_-_Raza_1&amp;diff=10195"/>
		<updated>2024-07-30T14:30:12Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pe planeta Quadratia, locuitorii folosesc forme pătrate în tot ceea ce construiesc. Ei au trimis pe solul planetei &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mașini speciale de apărare, numite &amp;#039;&amp;#039;&amp;#039;rovere&amp;#039;&amp;#039;&amp;#039;, care se deplasează pe traiectorii ce descriu pătrate. Harta  planetei poate fi privită ca un tablou bidimensional cu număr infinit de linii și coloane, numerotarea acestora începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Fiecare element al acestui tablou se identifică prin numărul liniei, respectiv numărul...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pe planeta Quadratia, locuitorii folosesc forme pătrate în tot ceea ce construiesc. Ei au trimis pe solul planetei &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; mașini speciale de apărare, numite &#039;&#039;&#039;rovere&#039;&#039;&#039;, care se deplasează pe traiectorii ce descriu pătrate. Harta  planetei poate fi privită ca un tablou bidimensional cu număr infinit de linii și coloane, numerotarea acestora începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Fiecare element al acestui tablou se identifică prin numărul liniei, respectiv numărul coloanei pe care se găsește.&lt;br /&gt;
&lt;br /&gt;
Fiecare rover este descris prin &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere naturale nenule &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;, reprezentând poziția (linia &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; și coloana &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;) elementului din colțul din stânga-sus al pătratului ce descrie traiectoria, respectiv lungimea &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; a laturii acestuia. Toate roverele pornesc inițial din elementul din colțul stânga-sus al pătratului ce descrie traiectoria, pe care o parcurg în sensul acelor de ceasornic, traversând câte un element pe secundă. Ele sunt programate să parcurgă această traiectorie fără a se opri. Este posibil ca mai multe rovere să se afle, la un moment dat, la aceeași poziție de pe hartă.&lt;br /&gt;
&lt;br /&gt;
Rectilinienii sunt singurii dușmani ai quadratienilor, ei deosebindu-se de aceștia prin folosirea consecventă a liniilor drepte în tot ceea ce construiesc. Rectilinienii au construit o armă laser de mare putere, pe care vor să o folosească la distrugerea roverelor quadratiene. Arma a fost adusă în poziția &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt; de pe harta planetei, adică elementul de pe prima linie și prima coloană.&lt;br /&gt;
&lt;br /&gt;
Arma poate emite &#039;&#039;&#039;o singură&#039;&#039;&#039; rază distructivă, timp de o secundă, dezafectând în acest timp toate roverele aflate în secunda respectivă pe diagonala principală a tabloului care descrie harta planetei. Arma nu poate fi detectată în primele &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; secunde. Traiectoria roverelor poate trece prin poziția în care a fost amplasată arma, fără a o putea detecta în primele &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; secunde.&lt;br /&gt;
&lt;br /&gt;
În imagine avem două rovere, acestea fiind identificate prin tripletele de numere &amp;lt;code&amp;gt;4, 2, 6&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;6, 9, 4&amp;lt;/code&amp;gt;.  Traiectoria primului rover începe din poziția &amp;lt;code&amp;gt;(4, 2)&amp;lt;/code&amp;gt; și are latura &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. Numerele de pe traiectorie reprezintă secunda la care se parcurge respectivul element al tabloului. Roverul va ajunge din nou în poziția inițială la secundele &amp;lt;code&amp;gt;21, 41, 61, ...&amp;lt;/code&amp;gt; Primul rover intersectează, la prima sa trecere, diagonala principală în două puncte: &amp;lt;code&amp;gt;(4, 4)&amp;lt;/code&amp;gt; la secunda &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(7, 7)&amp;lt;/code&amp;gt; la secunda &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;. Al doilea rover intersectează diagonala principală într-un singur punct, &amp;lt;code&amp;gt;(9, 9)&amp;lt;/code&amp;gt; la secundele &amp;lt;code&amp;gt;10, 22, 34, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care să rezolve următoarele cerințe:&lt;br /&gt;
&lt;br /&gt;
* Determină numărul roverelor a căror traiectorie se intersectează cu diagonala principală a tabloului ce descrie harta.&lt;br /&gt;
* Determină numărul maxim de rovere, care pot fi distruse simultan, într-o singură secundă, înainte de trecerea celor &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; secunde, precum și secunda minimă în care se poate realiza acest lucru.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Datele de intrare se citesc din fișierul &amp;lt;code&amp;gt;raza.in&amp;lt;/code&amp;gt;, care are următoarea structură:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie se află numărul natural &amp;lt;code&amp;gt;T ∈ {1, 2}&amp;lt;/code&amp;gt;, semnificând numărul cerinței de rezolvat.&lt;br /&gt;
* pe a doua linie se află numerele naturale nenule &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, separate printr-un spațiu, reprezentând numărul roverelor, respectiv numărul de secunde în care arma nu este detectată.&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află câte 3 numere naturale nenule, &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;, separate prin câte un spațiu, reprezentând coordonatele poziției inițiale, respectiv lungimea laturii traiectoriei fiecărui rover.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Datele de ieșire se vor afișa în fișierul &amp;lt;code&amp;gt;raza.out&amp;lt;/code&amp;gt;, care are următoarea structură în funcție de cerință:&lt;br /&gt;
&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;T = 1&amp;lt;/code&amp;gt;, pe prima linie se va afișa numărul roverelor a căror traiectorie se intersectează cu diagonala principală;&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;T = 2&amp;lt;/code&amp;gt;, pe prima linie se vor afișa două numere naturale, separate printr-un spațiu, reprezentând numărul maxim de rovere dezactivate și secunda minimă în care se poate realiza acest lucru.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 10.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ S ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ L, C ≤ 50.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ R ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Numărul maxim de rovere care se intersectează cu raza armei ≤ 1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru 28 de puncte, &amp;lt;code&amp;gt;T = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 72 de puncte, &amp;lt;code&amp;gt;T = 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;raza.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 2 100&lt;br /&gt;
 4 2 6&lt;br /&gt;
 6 9 4&lt;br /&gt;
&amp;lt;code&amp;gt;raza.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cerința este 1. Exemplul reprezintă desenul din enunț.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
&lt;br /&gt;
def calculate_trajectory(L, C, R):&lt;br /&gt;
    trajectory = []&lt;br /&gt;
    for t in range(4 * R):&lt;br /&gt;
        if t &amp;lt; R:&lt;br /&gt;
            trajectory.append((L, C + t))&lt;br /&gt;
        elif t &amp;lt; 2 * R:&lt;br /&gt;
            trajectory.append((L + t - R, C + R - 1))&lt;br /&gt;
        elif t &amp;lt; 3 * R:&lt;br /&gt;
            trajectory.append((L + R - 1, C + R - 1 - (t - 2 * R)))&lt;br /&gt;
        else:&lt;br /&gt;
            trajectory.append((L + R - 1 - (t - 3 * R), C))&lt;br /&gt;
    return trajectory&lt;br /&gt;
&lt;br /&gt;
def solve(N, rovers, S):&lt;br /&gt;
    diagonal_intersections = defaultdict(list)&lt;br /&gt;
    &lt;br /&gt;
    for rover in rovers:&lt;br /&gt;
        L, C, R = rover&lt;br /&gt;
        trajectory = calculate_trajectory(L, C, R)&lt;br /&gt;
        for i, (x, y) in enumerate(trajectory):&lt;br /&gt;
            if x == y:&lt;br /&gt;
                t = i + 1&lt;br /&gt;
                diagonal_intersections[t].append((L, C, R))&lt;br /&gt;
    &lt;br /&gt;
    count_per_second = defaultdict(int)&lt;br /&gt;
    for t, rovers_at_t in diagonal_intersections.items():&lt;br /&gt;
        if t &amp;lt;= S:&lt;br /&gt;
            count_per_second[t] += len(rovers_at_t)&lt;br /&gt;
    &lt;br /&gt;
    if not count_per_second:&lt;br /&gt;
        return 0, None, None&lt;br /&gt;
    &lt;br /&gt;
    max_destructions = max(count_per_second.values())&lt;br /&gt;
    min_time = min(t for t in count_per_second if count_per_second[t] == max_destructions)&lt;br /&gt;
    &lt;br /&gt;
    return len(diagonal_intersections), max_destructions, min_time&lt;br /&gt;
&lt;br /&gt;
# Example usage&lt;br /&gt;
N = 2&lt;br /&gt;
rovers = [(4, 2, 6), (6, 9, 4)]&lt;br /&gt;
S = 10&lt;br /&gt;
print(solve(N, rovers, S))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3766_-_Zid&amp;diff=10194</id>
		<title>3766 - Zid</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3766_-_Zid&amp;diff=10194"/>
		<updated>2024-07-28T09:00:11Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Un zid ornamental de formă dreptunghiulară este alcătuit din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; rânduri de cărămizi, fiecare rând având câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; cărămizi identice, așezate una lângă alta. Fiecare cărămidă este colorată într-una dintre culorile &amp;lt;code&amp;gt;{0, 1, 2, ..., C&amp;lt;sub&amp;gt;maxg&amp;lt;/sub&amp;gt;}&amp;lt;/code&amp;gt;. Un pătrat de latură &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; în acest zid este constituit din cărămizile situate pe &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; rânduri consecutive și &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; coloane consecutive. Spunem c...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un zid ornamental de formă dreptunghiulară este alcătuit din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; rânduri de cărămizi, fiecare rând având câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; cărămizi identice, așezate una lângă alta. Fiecare cărămidă este colorată într-una dintre culorile &amp;lt;code&amp;gt;{0, 1, 2, ..., C&amp;lt;sub&amp;gt;maxg&amp;lt;/sub&amp;gt;}&amp;lt;/code&amp;gt;. Un pătrat de latură &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; în acest zid este constituit din cărămizile situate pe &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; rânduri consecutive și &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; coloane consecutive. Spunem că un pătrat este colorat uniform dacă el conține același număr de cărămizi din fiecare culoare care apare în pătratul respectiv.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care, cunoscând configurația zidului, determină în acest zid un pătrat de latură maximă, colorat uniform.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;zid.in&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale &amp;lt;code&amp;gt;N M Cmax&amp;lt;/code&amp;gt;, reprezentând numărul de rânduri de cărămizi, numărul de cărămizi de pe fiecare rând, respectiv culoarea maximă. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii este descrisă configurația zidului, de sus în jos; pe fiecare linie dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; se află câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere naturale, reprezentând culorile cărămizilor de pe rândul respectiv, în ordine, de la stânga la dreapta. Valorile scrise pe aceeași linie sunt separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;zid.out&amp;lt;/code&amp;gt; va conține o singură linie pe care vor fi scrise trei numere naturale &amp;lt;code&amp;gt;Nr R C&amp;lt;/code&amp;gt;, separate prin câte un singur spațiu, reprezentând numărul de cărămizi existente într-un pătrat colorat uniform de latură maximă, respectiv rândul și cărămida de pe rând situată în colțul din stânga-sus al pătratului colorat uniform de latură maximă.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N, M ≤ 250&amp;lt;/code&amp;gt;• &amp;lt;code&amp;gt;1 ≤ Cmax ≤ 9&amp;lt;/code&amp;gt; • Rândurile sunt numerotate de sus în jos de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Cărămizile situate pe un rând sunt numerotate de la stânga la dreapta de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. • Dacă există mai multe pătrate colorate uniform de latură maximă se va alege pătratul pentru care numărul rândului este minim. Dacă există mai multe pătrate colorate uniform de latură maximă care au colțul din stânga-sus pe același rând minim, se va alege pătratul cel mai din stânga.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;zid.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 8 5&lt;br /&gt;
 1 2 3 5 1 2 3 5&lt;br /&gt;
 1 2 1 2 3 5 3 5&lt;br /&gt;
 1 1 1 2 2 3 3 3&lt;br /&gt;
 1 2 3 5 5 3 2 1&lt;br /&gt;
 3 3 1 1 2 2 5 5&lt;br /&gt;
 2 1 2 3 2 5 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;zid.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 9 2 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Pătratul colorat uniform de latură maximă, situat pe rândul cel mai de sus, cel mai în stânga este:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 3 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 2 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;5 5 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El conține &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; cărămizi, în care apar culorile &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; de câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; ori fiecare. Acest pătrat are colțul din&lt;br /&gt;
&lt;br /&gt;
stânga-sus situat pe rândul al doilea, în a patra cărămidă de pe rând (a patra coloană). Există și alte pătrate colorate uniform formate din &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; cărămizi, de exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 2 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;3 3 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 1 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dar acesta are colțul din stânga-sus pe rândul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire_date():&lt;br /&gt;
    N, M, Cmax = map(int, input().split())&lt;br /&gt;
    zid = [list(map(int, input().split())) for _ in range(N)]&lt;br /&gt;
    return N, M, Cmax, zid&lt;br /&gt;
&lt;br /&gt;
def construieste_matrice_cumulative(N, M, Cmax, zid):&lt;br /&gt;
    cumulative = [[[0] * (Cmax + 1) for _ in range(M + 1)] for _ in range(N + 1)]&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        for j in range(1, M + 1):&lt;br /&gt;
            culoare = zid[i-1][j-1]&lt;br /&gt;
            for c in range(Cmax + 1):&lt;br /&gt;
                cumulative[i][j][c] = cumulative[i-1][j][c] + cumulative[i][j-1][c] - cumulative[i-1][j-1][c]&lt;br /&gt;
            cumulative[i][j][culoare] += 1&lt;br /&gt;
&lt;br /&gt;
    return cumulative&lt;br /&gt;
&lt;br /&gt;
def verifica_uniformitatea(cumulative, x1, y1, x2, y2, Cmax):&lt;br /&gt;
    counts = [0] * (Cmax + 1)&lt;br /&gt;
    &lt;br /&gt;
    for c in range(Cmax + 1):&lt;br /&gt;
        counts[c] = (cumulative[x2][y2][c]&lt;br /&gt;
                     - cumulative[x1-1][y2][c]&lt;br /&gt;
                     - cumulative[x2][y1-1][c]&lt;br /&gt;
                     + cumulative[x1-1][y1-1][c])&lt;br /&gt;
    &lt;br /&gt;
    unique_counts = [count for count in counts if count &amp;gt; 0]&lt;br /&gt;
    return len(set(unique_counts)) == 1&lt;br /&gt;
&lt;br /&gt;
def gaseste_patrat_maxim_uniform(N, M, Cmax, zid):&lt;br /&gt;
    cumulative = construieste_matrice_cumulative(N, M, Cmax, zid)&lt;br /&gt;
    &lt;br /&gt;
    latura_maxima = min(N, M)&lt;br /&gt;
    &lt;br /&gt;
    for latura in range(latura_maxima, 0, -1):&lt;br /&gt;
        for i in range(1, N - latura + 2):&lt;br /&gt;
            for j in range(1, M - latura + 2):&lt;br /&gt;
                if verifica_uniformitatea(cumulative, i, j, i + latura - 1, j + latura - 1, Cmax):&lt;br /&gt;
                    return latura&lt;br /&gt;
    &lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N, M, Cmax, zid = citire_date()&lt;br /&gt;
    latura_maxima = gaseste_patrat_maxim_uniform(N, M, Cmax, zid)&lt;br /&gt;
    print(latura_maxima)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3438_-_Triunghi_5&amp;diff=10193</id>
		<title>3438 - Triunghi 5</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3438_-_Triunghi_5&amp;diff=10193"/>
		<updated>2024-07-28T08:58:29Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; un tablou bidimensional cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane și elemente numere naturale. O zonă triunghiulară a tabloului, reprezentată de tripletul &amp;lt;code&amp;gt;(lin, col, k)&amp;lt;/code&amp;gt;, este o zonă de forma unui triunghi dreptunghic cu catetele de lungime egală cu &amp;lt;code&amp;gt;|k|&amp;lt;/code&amp;gt;, definită astfel:  # Pentru &amp;lt;code&amp;gt;k&amp;gt;0&amp;lt;/code&amp;gt;, zona este compusă din &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii: #* pe prima linie a zonei se află elementele &amp;lt;code&amp;gt;A[lin][col]&amp;lt;/cod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; un tablou bidimensional cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane și elemente numere naturale. O zonă triunghiulară a tabloului, reprezentată de tripletul &amp;lt;code&amp;gt;(lin, col, k)&amp;lt;/code&amp;gt;, este o zonă de forma unui triunghi dreptunghic cu catetele de lungime egală cu &amp;lt;code&amp;gt;|k|&amp;lt;/code&amp;gt;, definită astfel:&lt;br /&gt;
&lt;br /&gt;
# Pentru &amp;lt;code&amp;gt;k&amp;gt;0&amp;lt;/code&amp;gt;, zona este compusă din &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii:&lt;br /&gt;
#* pe prima linie a zonei se află elementele &amp;lt;code&amp;gt;A[lin][col]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A[lin][col+1]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;A[lin][col+k-1]&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* pe a doua linie a zonei se află elementele &amp;lt;code&amp;gt;A[lin+1][col]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A[lin+1][col+1]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;A[lin+1][col+k-2]&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* pe a treia linie a zonei se află elementele &amp;lt;code&amp;gt;A[lin+2][col]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A[lin+2][col+1]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;A[lin+2][col+k-3]&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* …&lt;br /&gt;
#* pe ultima linie a zonei se află elementul &amp;lt;code&amp;gt;A[lin+k-1][col]&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Pentru &amp;lt;code&amp;gt;k&amp;lt;0&amp;lt;/code&amp;gt;, zona este compusă din &amp;lt;code&amp;gt;|k|=-k&amp;lt;/code&amp;gt; linii:&lt;br /&gt;
#* pe prima linie a zonei se află elementul &amp;lt;code&amp;gt;A[lin-|k|+1][col]&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* pe a doua linie a zonei se află elementele &amp;lt;code&amp;gt;A[lin-|k|+2][col-1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A[lin-|k|+2][col]&amp;lt;/code&amp;gt;;&lt;br /&gt;
#* …&lt;br /&gt;
#* pe ultima linie a zonei se află elementele &amp;lt;code&amp;gt;A[lin][col-|k|+1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A[lin][col-|k|+2]&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;A[lin][col]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Suma elementelor ce compun o zonă triunghiulară se numește suma zonei.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care, cunoscând tabloul &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; zone triunghiulare, determină cea mai mare dintre sumele zonelor.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;triunghi.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, cu semnificaţia din enunţ. Pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii se găsesc câte n valori naturale, reprezentând elementele tabloului &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;. Pe linia &amp;lt;code&amp;gt;n+2&amp;lt;/code&amp;gt; se află numărul natural &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, reprezentând numărul zonelor triunghiulare. Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se găsesc tripletele de valori &amp;lt;code&amp;gt;lin col k&amp;lt;/code&amp;gt;, care reprezintă cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; zone, în forma descrisă în enunţ. Valorile aflate pe aceeaşi linie a fişierului sunt separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;triunghi.out&amp;lt;/code&amp;gt; va conține o singură linie pe care va fi scris un număr natural reprezentând suma maximă cerută.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ n ≤ 1000&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;1 ≤ Q ≤ 100000&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;2 ≤ |k| ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Valorile din tablou sunt numere naturale din intervalul &amp;lt;code&amp;gt;[1,100]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Liniile şi coloanele tabloului &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; sunt numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; (liniile de sus în jos, iar coloanele de la stânga la dreapta).&lt;br /&gt;
* &amp;lt;code&amp;gt;|k|&amp;lt;/code&amp;gt; reprezintă modulul numărului &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, pentru &amp;lt;code&amp;gt;k≥0&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;-k&amp;lt;/code&amp;gt;, pentru &amp;lt;code&amp;gt;k&amp;lt;0&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Se garantează că orice zonă triunghiulară dintre cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; este complet inclusă în tabloul &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;triunghi.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 5 8 10 4 9 4&lt;br /&gt;
 2 10 10 2 4 8&lt;br /&gt;
 8 10 3 4 6 6&lt;br /&gt;
 4 6 9 7 1 9&lt;br /&gt;
 6 7 2 2 10 6&lt;br /&gt;
 10 4 6 1 10 4&lt;br /&gt;
 3&lt;br /&gt;
 4 1 3&lt;br /&gt;
 4 4 -4&lt;br /&gt;
 6 5 -2&lt;br /&gt;
&amp;lt;code&amp;gt;triunghi.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 59&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Zona triunghiulară de sumă maximă (&amp;lt;code&amp;gt;59&amp;lt;/code&amp;gt;) este reprezentată de tripletul &amp;lt;code&amp;gt;(4 4 -4)&amp;lt;/code&amp;gt; și conține&lt;br /&gt;
&lt;br /&gt;
valorile evienţiate: &amp;lt;code&amp;gt;59=4+(10+2)+(10+3+4)+(4+6+9+7)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def suma_zona_triunghiulara(A, lin, col, k):&lt;br /&gt;
    suma = 0&lt;br /&gt;
    n = len(A)&lt;br /&gt;
    &lt;br /&gt;
    if k &amp;gt; 0:&lt;br /&gt;
        # Zona triunghiulară pentru k &amp;gt; 0&lt;br /&gt;
        for i in range(k):&lt;br /&gt;
            for j in range(k - i):&lt;br /&gt;
                suma += A[lin + i][col + j]&lt;br /&gt;
    else:&lt;br /&gt;
        # Zona triunghiulară pentru k &amp;lt; 0&lt;br /&gt;
        k = -k&lt;br /&gt;
        for i in range(k):&lt;br /&gt;
            for j in range(i + 1):&lt;br /&gt;
                suma += A[lin - i + (k - 1)][col - j + (k - 1)]&lt;br /&gt;
    &lt;br /&gt;
    return suma&lt;br /&gt;
&lt;br /&gt;
def cea_mai_mare_suma(A, interogari):&lt;br /&gt;
    max_suma = float(&#039;-inf&#039;)&lt;br /&gt;
    &lt;br /&gt;
    for (lin, col, k) in interogari:&lt;br /&gt;
        suma = suma_zona_triunghiulara(A, lin, col, k)&lt;br /&gt;
        if suma &amp;gt; max_suma:&lt;br /&gt;
            max_suma = suma&lt;br /&gt;
    &lt;br /&gt;
    return max_suma&lt;br /&gt;
&lt;br /&gt;
# Citire date&lt;br /&gt;
n = int(input())&lt;br /&gt;
A = [list(map(int, input().split())) for _ in range(n)]&lt;br /&gt;
Q = int(input())&lt;br /&gt;
interogari = [tuple(map(int, input().split())) for _ in range(Q)]&lt;br /&gt;
&lt;br /&gt;
# Calculare cea mai mare sumă&lt;br /&gt;
result = cea_mai_mare_suma(A, interogari)&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2961_-_Deminare&amp;diff=10192</id>
		<title>2961 - Deminare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2961_-_Deminare&amp;diff=10192"/>
		<updated>2024-07-28T08:57:09Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pe un teren de formă dreptunghiulară format din &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; coloane sunt plantate &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; mine. Liniile sunt numerotate de sus în jos cu valori de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; iar coloanele sunt numerotate de la stânga la dreapta cu valori de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;. Deoarece războiul s-a terminat, specialiștii vor să demineze terenul și să-l redea utilizării publice. Mutarea unei mine reprezintă operația de tr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pe un teren de formă dreptunghiulară format din &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; coloane sunt plantate &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; mine. Liniile sunt numerotate de sus în jos cu valori de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; iar coloanele sunt numerotate de la stânga la dreapta cu valori de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;. Deoarece războiul s-a terminat, specialiștii vor să demineze terenul și să-l redea utilizării publice. Mutarea unei mine reprezintă operația de transfer a unei mine de la linia &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt; și coloana &amp;lt;code&amp;gt;y1&amp;lt;/code&amp;gt; la o poziție liberă, dată de linia &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt; și coloana &amp;lt;code&amp;gt;y2&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ x1, x2 ≤ L&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ y1, y2 ≤ C&amp;lt;/code&amp;gt;. Deoarece mutarea unei mine este periculoasă, trebuie determinat numărul minim de mine care trebuie mutate din poziția inițială astfel încât toate minele de pe teren să fie așezate unele lângă altele într-o zonă compactă dreptunghiulară, oriunde în cadrul terenului dat, pentru ca apoi să fie detonate împreună.&lt;br /&gt;
&lt;br /&gt;
Spre exemplu: dacă &amp;lt;code&amp;gt;L = 4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C = 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M = 8&amp;lt;/code&amp;gt; și minele sunt așezate inițial conform figurii de mai jos (zonele colorate cu negru arată pozițiile minelor), pentru a se ajunge la o așezare a minelor într-o zonă compactă de formă dreptunghiulară numărul minim de mine mutate este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând numărul de linii &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; și de coloane &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; ale terenului minat, numărul de mine &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, precum și poziția fiecărei mine, să se scrie un program care determină:&lt;br /&gt;
&lt;br /&gt;
1. linia sau liniile pe care se găsesc cele mai multe mine;&lt;br /&gt;
&lt;br /&gt;
2. numărul minim de mine mutate, pentru ca toate minele de pe teren să fie așezate într-o zonă compactă cu formă dreptunghiulară.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare este &amp;lt;code&amp;gt;deminare.in&amp;lt;/code&amp;gt; și conține:&lt;br /&gt;
&lt;br /&gt;
- pe prima linie numărul natural &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; a cărui valoare poate fi doar &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
- pe a doua linie două numere naturale &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, cu semnificația din enunț;&lt;br /&gt;
&lt;br /&gt;
- pe a treia linie numărul natural &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, cu semnificația din enunț;&lt;br /&gt;
&lt;br /&gt;
- pe fiecare din următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii, câte o pereche de valori &amp;lt;code&amp;gt;x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt;, reprezentând linia, respectiv coloana, unde se află o mină;&lt;br /&gt;
&lt;br /&gt;
Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire este &amp;lt;code&amp;gt;deminare.out&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; atunci prima linie a fișierului de ieșire va conține numărul liniei pe care se găsesc cele mai multe mine. Dacă există două sau mai multe astfel de linii, se vor afișa toate numerele acestora, în ordine crescătoare, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; atunci fișierul de ieșire va conține pe prima linie numărul minim cerut de mine mutate. Dacă minele nu pot fi așezate într-o zonă compactă de formă dreptunghiulară, în fișierul de ieșire se va scrie valoarea &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ L, C ≤ 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ L • C&amp;lt;/code&amp;gt;&lt;br /&gt;
* O zonă în care se află mine așezate pe coloane consecutive, pe aceeași linie sau așezate pe linii consecutive, pe aceeași coloană se consideră că formează o zonă compactă de formă dreptunghiulară.&lt;br /&gt;
* O zonă compactă de formă dreptunghiulară poate avea numărul de linii ocupate egal cu numărul de coloane ocupate.&lt;br /&gt;
* Pentru teste valorând &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte, avem &amp;lt;code&amp;gt;V = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste valorând &amp;lt;code&amp;gt;70&amp;lt;/code&amp;gt; de puncte, avem &amp;lt;code&amp;gt;V = 2&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste valorând &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte, avem &amp;lt;code&amp;gt;V = 2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;L • C ≤ 10.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste valorând &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; de puncte, avem &amp;lt;code&amp;gt;V = 2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;L • C ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* În concurs s-au acordat &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte din oficiu. Aici se acordă pentru exemplele din enunț.&lt;br /&gt;
&lt;br /&gt;
= Exemplul: =&lt;br /&gt;
&amp;lt;code&amp;gt;deminare.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 4 5&lt;br /&gt;
 8&lt;br /&gt;
 1 2&lt;br /&gt;
 1 5&lt;br /&gt;
 2 1&lt;br /&gt;
 3 2&lt;br /&gt;
 3 5&lt;br /&gt;
 4 3&lt;br /&gt;
 4 4&lt;br /&gt;
 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;deminare.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;V = 1&amp;lt;/code&amp;gt;, deci se rezolvă doar cerința 1. &amp;lt;code&amp;gt;L = 4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C = 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M = 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Minele sunt plasate la pozițiile &amp;lt;code&amp;gt;(1,2)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(1,5)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(2,1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(3,2)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(3,5)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(4,3)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(4,4)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(4,5)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe linia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sunt amplasate &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; mine;&lt;br /&gt;
&lt;br /&gt;
Pe linia &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; este amplasată &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; mină;&lt;br /&gt;
&lt;br /&gt;
Pe linia &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; sunt amplasate &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; mine;&lt;br /&gt;
&lt;br /&gt;
Pe linia &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; sunt amplasate &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; mine;&lt;br /&gt;
&lt;br /&gt;
Deci, există o singură linie pe care sunt amplasate un număr maxim de mine și anume linia &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire_date():&lt;br /&gt;
    L, C, M = map(int, input().split())&lt;br /&gt;
    mine = []&lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        x, y = map(int, input().split())&lt;br /&gt;
        mine.append((x-1, y-1))  # Ajustare la indexare zero-based&lt;br /&gt;
    return L, C, M, mine&lt;br /&gt;
&lt;br /&gt;
def linii_cu_cele_mai_multe_mine(L, mine):&lt;br /&gt;
    count_per_line = [0] * L&lt;br /&gt;
    for (x, y) in mine:&lt;br /&gt;
        count_per_line[x] += 1&lt;br /&gt;
    max_mine = max(count_per_line)&lt;br /&gt;
    linii_max = [i + 1 for i, count in enumerate(count_per_line) if count == max_mine]&lt;br /&gt;
    return linii_max&lt;br /&gt;
&lt;br /&gt;
def mutari_minime(L, C, mine):&lt;br /&gt;
    mine_set = set(mine)&lt;br /&gt;
    mine_positions = [(x, y) for x, y in mine]&lt;br /&gt;
    &lt;br /&gt;
    def mine_in_rect(x1, y1, x2, y2):&lt;br /&gt;
        count = 0&lt;br /&gt;
        for x in range(x1, x2 + 1):&lt;br /&gt;
            for y in range(y1, y2 + 1):&lt;br /&gt;
                if (x, y) in mine_set:&lt;br /&gt;
                    count += 1&lt;br /&gt;
        return count&lt;br /&gt;
    &lt;br /&gt;
    min_moves = float(&#039;inf&#039;)&lt;br /&gt;
    for x1 in range(L):&lt;br /&gt;
        for y1 in range(C):&lt;br /&gt;
            for x2 in range(x1, L):&lt;br /&gt;
                for y2 in range(y1, C):&lt;br /&gt;
                    total_in_rect = mine_in_rect(x1, y1, x2, y2)&lt;br /&gt;
                    if total_in_rect == len(mine):&lt;br /&gt;
                        min_moves = 0&lt;br /&gt;
                        break&lt;br /&gt;
                    current_moves = len(mine) - total_in_rect&lt;br /&gt;
                    min_moves = min(min_moves, current_moves)&lt;br /&gt;
    &lt;br /&gt;
    return min_moves&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    L, C, M, mine = citire_date()&lt;br /&gt;
    linii_max = linii_cu_cele_mai_multe_mine(L, mine)&lt;br /&gt;
    min_mutari = mutari_minime(L, C, mine)&lt;br /&gt;
    &lt;br /&gt;
    print(&amp;quot;Linii cu cele mai multe mine:&amp;quot;, &amp;quot; &amp;quot;.join(map(str, linii_max)))&lt;br /&gt;
    print(&amp;quot;Număr minim de mine mutate:&amp;quot;, min_mutari)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2898_-_Nave&amp;diff=10191</id>
		<title>2898 - Nave</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2898_-_Nave&amp;diff=10191"/>
		<updated>2024-07-28T08:55:16Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Echipajul navei Enterprise, a descoperit pe planeta Marte, zona în care sunt amplasate b baze militare care adăpostesc navele de luptă ale marțienilor. Echipajul navei a reușit să cartografieze zona și a împărțit harta planetei în &amp;lt;code&amp;gt;n x m&amp;lt;/code&amp;gt; zone de latură 1, dispuse pe n linii (numerotate de sus în jos de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;) și m coloane (numerotate de la stânga la dreapta de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;). Astfel fiecare zonă p...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Echipajul navei Enterprise, a descoperit pe planeta Marte, zona în care sunt amplasate b baze militare care adăpostesc navele de luptă ale marțienilor. Echipajul navei a reușit să cartografieze zona și a împărțit harta planetei în &amp;lt;code&amp;gt;n x m&amp;lt;/code&amp;gt; zone de latură 1, dispuse pe n linii (numerotate de sus în jos de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;) și m coloane (numerotate de la stânga la dreapta de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;). Astfel fiecare zonă poate fi identificată prin numărul liniei și al coloanei pe care se află. În fiecare astfel de zonă se află o bază a marțienilor ce adăpostește un număr de nave. Căpitanul navei Enterprise, Jean-Luc Picard a elaborat o strategie de atac terestru a acestor baze militare. &lt;br /&gt;
&lt;br /&gt;
Nava Enterprise poate ateriza într-o zonă în care nu se află o bază marțiană și poate lansa un singur atac (deoarece după primul atac bazele marțiene își vor activa scuturile de protecție). La un atac se vor emite simultan 2 raze laser care vor distruge toate navele marțiene existente în bazele aflate pe direcția acestor raze, în ambele sensuri. Razele sunt emise din centrul zonei în care a aterizat Enterprise și fac unghiuri de &amp;lt;code&amp;gt;45&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;135&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; cu linia pe care se află Enterprise.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care, cunoscând configurația bazelor marțiene, determină numărul maxim de nave marțiene pe care Enterprise le poate distruge la un singur atac, precum și linia și coloana zonei în care poate ateriza nava Enterprise astfel încât să distrugă un număr maxim de nave; dacă există mai multe zone în care poate ateriza convenabil pentru Enterprise este să aleagă zona pentru care linia este maximă; dacă există mai multe zone pe linia maximă, se va alege cea pentru care coloana este maximă.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nave.in&amp;lt;/code&amp;gt; conține pe prima linie trei numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, separate prin câte un spațiu, reprezentând numărul de linii, numărul de coloane ale hărții planetei Marte, respectiv numărul  de baze marțiene. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; linii este descrisă câte o bază marțiană sub forma a trei numere naturale separate prin câte un spațiu &amp;lt;code&amp;gt;lin col nr&amp;lt;/code&amp;gt;, reprezentând linia și coloana pe care se află baza marțiană, respectiv numărul de nave aflate în baza marțiană respectivă.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nave.out&amp;lt;/code&amp;gt; va conține pe prima linie trei numere naturale &amp;lt;code&amp;gt;nrmax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;linmax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;colmax&amp;lt;/code&amp;gt;, separate prin câte un spațiu, reprezentând numărul maxim de nave marțiene pe care Enterprise le poate distruge la un singur atac, precum și linia și coloana zonei în care poate ateriza nava Enterprise astfel încât să distrugă un număr maxim de nave; dacă există mai multe zone în care poate ateriza convenabil pentru Enterprise este să aleagă zona pentru care linia este maximă; dacă există mai multe zone pe linia maximă, se va alege cea pentru care coloana este maximă.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n, m ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;n x m ≤ b&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;b ≤ n * m / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ lin ≤ n&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;1 ≤ col ≤ m&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;1 ≤ nr ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;nave.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 4 9&lt;br /&gt;
 1 1 3&lt;br /&gt;
 1 2 5&lt;br /&gt;
 2 2 7&lt;br /&gt;
 2 4 9&lt;br /&gt;
 3 1 6&lt;br /&gt;
 3 3 8 &lt;br /&gt;
 4 1 1 &lt;br /&gt;
 5 1 4&lt;br /&gt;
 5 3 2&lt;br /&gt;
&amp;lt;code&amp;gt;nave.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 29 4 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Harta zonei unde se găsesc bazele marțiene este:&lt;br /&gt;
&lt;br /&gt;
Dacă nava Enterprise aterizează în zona situată pe linia &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; și coloana &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, va distruge un număr maxim de nave (&amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def read_input():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
    harta = []&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        linie = list(map(int, input().split()))&lt;br /&gt;
        harta.append(linie)&lt;br /&gt;
    return n, m, harta&lt;br /&gt;
&lt;br /&gt;
def calculeaza_sume_diagonale(n, m, harta):&lt;br /&gt;
    diag1 = [[0] * m for _ in range(n)]&lt;br /&gt;
    diag2 = [[0] * m for _ in range(n)]&lt;br /&gt;
    &lt;br /&gt;
    # Sume diagonale 45° (/)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if i &amp;gt; 0 and j &amp;gt; 0:&lt;br /&gt;
                diag1[i][j] = harta[i][j] + diag1[i-1][j-1]&lt;br /&gt;
            else:&lt;br /&gt;
                diag1[i][j] = harta[i][j]&lt;br /&gt;
&lt;br /&gt;
    # Sume diagonale 135° (\)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if i &amp;gt; 0 and j &amp;lt; m - 1:&lt;br /&gt;
                diag2[i][j] = harta[i][j] + diag2[i-1][j+1]&lt;br /&gt;
            else:&lt;br /&gt;
                diag2[i][j] = harta[i][j]&lt;br /&gt;
&lt;br /&gt;
    return diag1, diag2&lt;br /&gt;
&lt;br /&gt;
def gaseste_punct_optim(n, m, harta, diag1, diag2):&lt;br /&gt;
    max_nave = 0&lt;br /&gt;
    coordonate_optime = (-1, -1)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if harta[i][j] == 0:  # Poate ateriza doar într-o zonă fără bază marțiană&lt;br /&gt;
                suma_nave = 0&lt;br /&gt;
                if i &amp;gt; 0 and j &amp;gt; 0:&lt;br /&gt;
                    suma_nave += diag1[i-1][j-1]&lt;br /&gt;
                if i &amp;gt; 0 and j &amp;lt; m - 1:&lt;br /&gt;
                    suma_nave += diag2[i-1][j+1]&lt;br /&gt;
                &lt;br /&gt;
                if suma_nave &amp;gt; max_nave:&lt;br /&gt;
                    max_nave = suma_nave&lt;br /&gt;
                    coordonate_optime = (i + 1, j + 1)&lt;br /&gt;
                elif suma_nave == max_nave:&lt;br /&gt;
                    if i + 1 &amp;gt; coordonate_optime[0] or (i + 1 == coordonate_optime[0] and j + 1 &amp;gt; coordonate_optime[1]):&lt;br /&gt;
                        coordonate_optime = (i + 1, j + 1)&lt;br /&gt;
&lt;br /&gt;
    return max_nave, coordonate_optime&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m, harta = read_input()&lt;br /&gt;
    diag1, diag2 = calculeaza_sume_diagonale(n, m, harta)&lt;br /&gt;
    max_nave, coordonate_optime = gaseste_punct_optim(n, m, harta, diag1, diag2)&lt;br /&gt;
    &lt;br /&gt;
    print(max_nave)&lt;br /&gt;
    print(coordonate_optime[0], coordonate_optime[1])&lt;br /&gt;
&lt;br /&gt;
# Apelare funcție principală&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2607_-_Pentagon&amp;diff=10190</id>
		<title>2607 - Pentagon</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2607_-_Pentagon&amp;diff=10190"/>
		<updated>2024-07-28T08:52:55Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: În urma bombardamentelor din 11 septembrie 2001, clădirea Pentagonului a suferit daune la unul din pereții clădirii. Imaginea codificată a peretelui avariat se reprezintă sub forma unei matrice cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane, ca în figura de mai jos:  &amp;lt;code&amp;gt;1110000111&amp;lt;/code&amp;gt;		  &amp;lt;code&amp;gt;1100001111&amp;lt;/code&amp;gt;			  &amp;lt;code&amp;gt;1000000011&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;1111101111&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;1110000111&amp;lt;/code&amp;gt;  unde &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; reprezintă zid intact, iar &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zid avar...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În urma bombardamentelor din 11 septembrie 2001, clădirea Pentagonului a suferit daune la unul din pereții clădirii. Imaginea codificată a peretelui avariat se reprezintă sub forma unei matrice cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane, ca în figura de mai jos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1110000111&amp;lt;/code&amp;gt;		&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1100001111&amp;lt;/code&amp;gt;			&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1000000011&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1111101111&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1110000111&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unde &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; reprezintă zid intact, iar &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zid avariat. Sumele alocate pentru refacerea Pentagonului vor fi donate celor care vor ajuta americanii să refacă această clădire prin plasarea, pe verticală, a unor blocuri de înălțimi &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k=1&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, și lățime &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, în locurile avariate.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru o structură dată a unui perete din clădirea Pentagonului, determinaţi numărul minim al blocurilor, de înălţimi &amp;lt;code&amp;gt;k=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;k=2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;k=m&amp;lt;/code&amp;gt;, necesare refacerii clădirii.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;pentagon.in&amp;lt;/code&amp;gt; conține pe prima linie dimensiunile &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; ale peretelui clădirii, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii câte o secvență de caractere &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; de lungime &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;pentagon.out&amp;lt;/code&amp;gt; va conține pe câte o linie, ordonate crescător după &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, perechi de forma &amp;lt;code&amp;gt;k nr&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; este înălțimea blocului, iar &amp;lt;code&amp;gt;nr&amp;lt;/code&amp;gt; este numărul de blocuri de înălțime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m, n ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* nu se vor afișa blocurile de înălțime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, a căror număr este zero (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;pentagon.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 10&lt;br /&gt;
 1110000111&lt;br /&gt;
 1100001111&lt;br /&gt;
 1000000011&lt;br /&gt;
 1111101111&lt;br /&gt;
 1110000111&lt;br /&gt;
&amp;lt;code&amp;gt;pentagon.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 7&lt;br /&gt;
 2 1&lt;br /&gt;
 3 2&lt;br /&gt;
 5 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def min_blocks_to_repair(matrix):&lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    min_blocks = 0&lt;br /&gt;
    &lt;br /&gt;
    for col in range(n):&lt;br /&gt;
        row = 0&lt;br /&gt;
        while row &amp;lt; m:&lt;br /&gt;
            if matrix[row][col] == 0:&lt;br /&gt;
                height = 1&lt;br /&gt;
                while row + height &amp;lt; m and matrix[row + height][col] == 0:&lt;br /&gt;
                    height += 1&lt;br /&gt;
                min_blocks += 1&lt;br /&gt;
                row += height&lt;br /&gt;
            else:&lt;br /&gt;
                row += 1&lt;br /&gt;
                &lt;br /&gt;
    return min_blocks&lt;br /&gt;
&lt;br /&gt;
# Testare&lt;br /&gt;
matrix = [&lt;br /&gt;
    [1, 1, 1, 0, 0, 0, 1, 1, 1],&lt;br /&gt;
    [1, 1, 0, 0, 0, 0, 1, 1, 1],&lt;br /&gt;
    [1, 0, 0, 0, 0, 0, 0, 1, 1],&lt;br /&gt;
    [1, 1, 1, 1, 1, 0, 1, 1, 1],&lt;br /&gt;
    [1, 1, 1, 0, 0, 0, 1, 1, 1]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
print(min_blocks_to_repair(matrix))  # Output: 8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2432_-_Cruce&amp;diff=10189</id>
		<title>2432 - Cruce</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2432_-_Cruce&amp;diff=10189"/>
		<updated>2024-07-26T08:17:41Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră o matrice pătratică de dimensiune &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, conţinând numere naturale. Numim &amp;#039;&amp;#039;&amp;#039;cruce de lăţime&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; reuniunea mulțimii tuturor elementelor aflate pe &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; linii consecutive ale matricei și a mulțimii tuturor elementelor aflate pe &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; coloane consecutive ale matricei. Două elemente ale matricei se consideră distincte dacă sunt situate pe poziții distincte în matrice. Se acceptă şi forma degenerată a unei cr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o matrice pătratică de dimensiune &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, conţinând numere naturale. Numim &#039;&#039;&#039;cruce de lăţime&#039;&#039;&#039; &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; reuniunea mulțimii tuturor elementelor aflate pe &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; linii consecutive ale matricei și a mulțimii tuturor elementelor aflate pe &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; coloane consecutive ale matricei. Două elemente ale matricei se consideră distincte dacă sunt situate pe poziții distincte în matrice. Se acceptă şi forma degenerată a unei cruci, în formă de &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;, când una dintre liniile sau coloanele care formează crucea sunt chiar la marginea matricei. Vom defini &#039;&#039;&#039;valoarea&#039;&#039;&#039; unei cruci ca fiind suma elementelor din care aceasta este formată.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care, pentru o valoare &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; dată, determină o cruce de lățime &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; a cărei valoare este maximă și poziția ei în matrice. Această poziție va fi exprimată prin perechea de indici reprezentând prima linie din cele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; consecutive și prima coloană din cele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; consecutive din care este formată crucea.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul &amp;lt;code&amp;gt;cruce.in&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi reprezentând în ordine, pe linii, elementele matricei. Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul &amp;lt;code&amp;gt;cruce.out&amp;lt;/code&amp;gt; va conţine trei numere &amp;lt;code&amp;gt;Vmax L C&amp;lt;/code&amp;gt;, separate prin câte un spaţiu, reprezentând valoarea maximă determinată pentru o cruce de lățime &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, respectiv linia și coloana care exprimă poziția acesteia în matrice.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K &amp;lt; N&amp;lt;/code&amp;gt;&lt;br /&gt;
* Numerele din matrice sunt din intervalul &amp;lt;code&amp;gt;[-5000, 5000]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Liniile şi coloanele se indexează începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Dacă există mai  multe cruci de lățime &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; de valoare maximă, se va lua în considerare poziția cu indicele &#039;&#039;&#039;liniei&#039;&#039;&#039; mai mic, iar în caz de egalitate a liniilor poziția celei cu indicele &#039;&#039;&#039;coloanei&#039;&#039;&#039; mai mic.&lt;br /&gt;
* La olimpiadă s-au oferit 10 puncte din oficiu, aici vor fi date pe exemple.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;cruce.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 2&lt;br /&gt;
 1 -2 3 -1 4&lt;br /&gt;
 -3 2 2 -2 -1&lt;br /&gt;
 1 2 3 4 5&lt;br /&gt;
 1 0 -7 1 1&lt;br /&gt;
 3 2 1 2 3&lt;br /&gt;
&amp;lt;code&amp;gt;cruce.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 23 2 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Elementele ce formează crucea de valoare maxima sunt:&lt;br /&gt;
&lt;br /&gt;
1 -2 3 &amp;lt;code&amp;gt;-1 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-3 2 2 -2 -1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 2 3 4 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1 0 -7 &amp;lt;code&amp;gt;1 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 2 1 &amp;lt;code&amp;gt;2 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def calculeaza_prefix_sum(matrice, N):&lt;br /&gt;
    prefix_sum = [[0] * (N + 1) for _ in range(N + 1)]&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        for j in range(1, N + 1):&lt;br /&gt;
            prefix_sum[i][j] = matrice[i - 1][j - 1] \&lt;br /&gt;
                                + prefix_sum[i - 1][j] \&lt;br /&gt;
                                + prefix_sum[i][j - 1] \&lt;br /&gt;
                                - prefix_sum[i - 1][j - 1]&lt;br /&gt;
    return prefix_sum&lt;br /&gt;
&lt;br /&gt;
def suma_submatrice(prefix_sum, x1, y1, x2, y2):&lt;br /&gt;
    return (prefix_sum[x2][y2]&lt;br /&gt;
            - prefix_sum[x1 - 1][y2]&lt;br /&gt;
            - prefix_sum[x2][y1 - 1]&lt;br /&gt;
            + prefix_sum[x1 - 1][y1 - 1])&lt;br /&gt;
&lt;br /&gt;
def cruce_maxima(matrice, N, K):&lt;br /&gt;
    prefix_sum = calculeaza_prefix_sum(matrice, N)&lt;br /&gt;
    max_valoare = -1&lt;br /&gt;
    max_pos = (0, 0)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, N - K + 2):&lt;br /&gt;
        for j in range(1, N - K + 2):&lt;br /&gt;
            # Suma liniilor K consecutive&lt;br /&gt;
            suma_linii = 0&lt;br /&gt;
            for r in range(K):&lt;br /&gt;
                suma_linii += suma_submatrice(prefix_sum, i + r, j, i + r, j + K - 1)&lt;br /&gt;
                &lt;br /&gt;
            # Suma coloanelor K consecutive&lt;br /&gt;
            suma_coloane = 0&lt;br /&gt;
            for c in range(K):&lt;br /&gt;
                suma_coloane += suma_submatrice(prefix_sum, i, j + c, i + K - 1, j + c)&lt;br /&gt;
                &lt;br /&gt;
            # Calculul valorii crucii&lt;br /&gt;
            suma_cruce = suma_linii + suma_coloane - suma_submatrice(prefix_sum, i, j, i + K - 1, j + K - 1)&lt;br /&gt;
            &lt;br /&gt;
            if suma_cruce &amp;gt; max_valoare:&lt;br /&gt;
                max_valoare = suma_cruce&lt;br /&gt;
                max_pos = (i, j)&lt;br /&gt;
    &lt;br /&gt;
    return max_valoare, max_pos&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    import sys&lt;br /&gt;
    input = sys.stdin.read&lt;br /&gt;
    data = input().split()&lt;br /&gt;
    &lt;br /&gt;
    N = int(data[0])&lt;br /&gt;
    K = int(data[1])&lt;br /&gt;
    matrice = []&lt;br /&gt;
    &lt;br /&gt;
    index = 2&lt;br /&gt;
    for _ in range(N):&lt;br /&gt;
        matrice.append([int(x) for x in data[index:index + N]])&lt;br /&gt;
        index += N&lt;br /&gt;
    &lt;br /&gt;
    max_valoare, max_pos = cruce_maxima(matrice, N, K)&lt;br /&gt;
    print(max_valoare)&lt;br /&gt;
    print(max_pos[0], max_pos[1])&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2359_-_Cifre_13&amp;diff=10188</id>
		<title>2359 - Cifre 13</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2359_-_Cifre_13&amp;diff=10188"/>
		<updated>2024-07-26T08:16:00Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pe o foaie de matematică cu &amp;lt;code&amp;gt;N x M&amp;lt;/code&amp;gt; pătrăţele, Maria desenează &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; cifre. Fiecare cifră este desenată într-o zonă formată din &amp;lt;code&amp;gt;7 x 4&amp;lt;/code&amp;gt; pătrăţele albe şi negre denumite pixeli, aşa cum este ilustrat mai jos :  Fiecare pixel ocupă exact un pătrăţel pe foaia de matematică. Evident, pe foaie Maria va desena doar pixelii negri.  = Cerința = Determinaţi numărul de pătrăţele negre de pe foaia de matematică după ce au fost d...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pe o foaie de matematică cu &amp;lt;code&amp;gt;N x M&amp;lt;/code&amp;gt; pătrăţele, Maria desenează &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; cifre. Fiecare cifră este desenată într-o zonă formată din &amp;lt;code&amp;gt;7 x 4&amp;lt;/code&amp;gt; pătrăţele albe şi negre denumite pixeli, aşa cum este ilustrat mai jos :&lt;br /&gt;
&lt;br /&gt;
Fiecare pixel ocupă exact un pătrăţel pe foaia de matematică. Evident, pe foaie Maria va desena doar pixelii negri.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinaţi numărul de pătrăţele negre de pe foaia de matematică după ce au fost desenate cele &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; cifre.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;cifre13.in&amp;lt;/code&amp;gt; conţine pe prima linie numerele naturale &amp;lt;code&amp;gt;N M C&amp;lt;/code&amp;gt; cu semnificaţia din enunţ. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; linii se găseşte câte un triplet de numere naturale &amp;lt;code&amp;gt;t lin col&amp;lt;/code&amp;gt; ce descrie cifrele scrise de Maria şi poziţiile acestora pe foaia de matematică. Mai exact, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; este cifra ce va fi scrisă pe foaie, iar &amp;lt;code&amp;gt;lin col&amp;lt;/code&amp;gt; reprezintă linia, respectiv coloana pe care este plasat colţul stânga-sus al zonei care reprezintă cifra în cadrul foii de matematică.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;cifre13.out&amp;lt;/code&amp;gt; va conţine o singură linie pe care va fi scris numărul de pătrăţele negre existente pe foaia de matematică, după desenarea celor &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; cifre.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N, M ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ C ≤ 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Liniile de pe foaia de matematică sunt numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, iar coloanele de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; lin , col ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ t ≤ 9&amp;lt;/code&amp;gt;&lt;br /&gt;
* Zonele pe care sunt desenate cifrele se pot suprapune.&lt;br /&gt;
* Cifrele pot să încapă parţial pe foaie.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;cifre13.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 10 2&lt;br /&gt;
 4 2 3&lt;br /&gt;
 6 4 6&lt;br /&gt;
&amp;lt;code&amp;gt;cifre13.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 23&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Modelele pentru cifrele 0-9&lt;br /&gt;
cifre = {&lt;br /&gt;
    &#039;0&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;1&#039;: [&lt;br /&gt;
        &amp;quot;0010&amp;quot;,&lt;br /&gt;
        &amp;quot;0110&amp;quot;,&lt;br /&gt;
        &amp;quot;0010&amp;quot;,&lt;br /&gt;
        &amp;quot;0010&amp;quot;,&lt;br /&gt;
        &amp;quot;0010&amp;quot;,&lt;br /&gt;
        &amp;quot;0010&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;2&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1000&amp;quot;,&lt;br /&gt;
        &amp;quot;1000&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;3&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;4&#039;: [&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;5&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1000&amp;quot;,&lt;br /&gt;
        &amp;quot;1000&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;6&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1000&amp;quot;,&lt;br /&gt;
        &amp;quot;1000&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;7&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;8&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &#039;9&#039;: [&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;0001&amp;quot;,&lt;br /&gt;
        &amp;quot;1111&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
def numar_patratele_negre(cifre, cifra):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Numără pătrățelele negre dintr-o cifră specifică&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    model = cifre[cifra]&lt;br /&gt;
    return sum(row.count(&#039;1&#039;) for row in model)&lt;br /&gt;
&lt;br /&gt;
def total_patratele_negre(cifre, lista_cifre):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Calculează numărul total de pătrățele negre pentru toate cifrele date&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    total = 0&lt;br /&gt;
    for cifra in lista_cifre:&lt;br /&gt;
        total += numar_patratele_negre(cifre, cifra)&lt;br /&gt;
    return total&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
def main():&lt;br /&gt;
    import sys&lt;br /&gt;
    input = sys.stdin.read&lt;br /&gt;
    &lt;br /&gt;
    # Citim datele&lt;br /&gt;
    data = input().strip()&lt;br /&gt;
    lista_cifre = data.split()&lt;br /&gt;
    &lt;br /&gt;
    # Calculăm numărul total de pătrățele negre&lt;br /&gt;
    total_negre = total_patratele_negre(cifre, lista_cifre)&lt;br /&gt;
    &lt;br /&gt;
    # Afișăm rezultatul&lt;br /&gt;
    print(total_negre)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2140_-_Poartas&amp;diff=10187</id>
		<title>2140 - Poartas</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2140_-_Poartas&amp;diff=10187"/>
		<updated>2024-07-26T08:14:12Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră harta universului ca fiind o matrice cu &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de linii și &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de coloane. În fiecare celulă se găsește o așa numită poartă stelară, iar în anumite celule se găsesc echipaje ale porții stelare. La o deplasare, un echipaj se poate deplasa din locul în care se află în oricare alt loc în care se găsește o a doua poartă, în cazul nostru în orice altă poziție din matrice. Nu se permite situarea simultană a mai mult de un...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră harta universului ca fiind o matrice cu &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de linii și &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt; de coloane. În fiecare celulă se găsește o așa numită poartă stelară, iar în anumite celule se găsesc echipaje ale porții stelare. La o deplasare, un echipaj se poate deplasa din locul în care se află în oricare alt loc în care se găsește o a doua poartă, în cazul nostru în orice altă poziție din matrice. Nu se permite situarea simultană a mai mult de un echipaj într o celulă. La un moment dat un singur echipaj se poate deplasa de la o poartă stelară la alta.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se un număr &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; de echipaje, pentru fiecare echipaj fiind precizate poziția inițială și poziția finală, determinați numărul minim de deplasări necesare pentru ca toate echipajele să ajungă din poziția inițială în cea finală.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;poartas.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; reprezentând numărul  echipaje, iar pe următoarele &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale, primele două reprezentând coordonatele poziției inițiale a unui echipaj (linie coloană), următoarele două reprezentând coordonatele poziției finale a aceluiași echipaj (linie coloană).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;poartas.out&amp;lt;/code&amp;gt; va conține un singur număr reprezentând numărul minim de deplasări necesar.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* coordonatele pozițiilor inițiale și finale ale echipajelor sunt numere naturale din intervalul &amp;lt;code&amp;gt;[1, 250]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; p &amp;lt; 5000&amp;lt;/code&amp;gt;&lt;br /&gt;
* pozițiile inițiale ale celor &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; echipaje sunt distincte două câte două&lt;br /&gt;
* pozițiile finale ale celor &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; echipaje sunt distincte două câte două&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;poartas.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 2 3 4&lt;br /&gt;
 6 5 3 9&lt;br /&gt;
 3 4 1 2&lt;br /&gt;
&amp;lt;code&amp;gt;poartas.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire_date(nume_fisier):&lt;br /&gt;
    import sys&lt;br /&gt;
    input = sys.stdin.read&lt;br /&gt;
    data = input().strip().split()&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem datele&lt;br /&gt;
    index = 0&lt;br /&gt;
    p = int(data[index])&lt;br /&gt;
    index += 1&lt;br /&gt;
    echipaje = []&lt;br /&gt;
    for _ in range(p):&lt;br /&gt;
        x1, y1, x2, y2 = map(int, data[index:index+4])&lt;br /&gt;
        echipaje.append(((x1, y1), (x2, y2)))&lt;br /&gt;
        index += 4&lt;br /&gt;
    &lt;br /&gt;
    return p, echipaje&lt;br /&gt;
&lt;br /&gt;
def floyd_warshall(dist, noduri):&lt;br /&gt;
    # Aplicam algoritmul lui Floyd-Warshall pentru toate perechile de noduri&lt;br /&gt;
    for k in range(noduri):&lt;br /&gt;
        for i in range(noduri):&lt;br /&gt;
            for j in range(noduri):&lt;br /&gt;
                if dist[i][j] &amp;gt; dist[i][k] + dist[k][j]:&lt;br /&gt;
                    dist[i][j] = dist[i][k] + dist[k][j]&lt;br /&gt;
&lt;br /&gt;
def numar_minim_deplasari(p, echipaje):&lt;br /&gt;
    # Initializare matrice de distante mari (infinite)&lt;br /&gt;
    INF = float(&#039;inf&#039;)&lt;br /&gt;
    # Creem un dictionar pentru a stoca distantele intre porțile stelare&lt;br /&gt;
    noduri = {}&lt;br /&gt;
    index_nod = 0&lt;br /&gt;
    for ((x1, y1), (x2, y2)) in echipaje:&lt;br /&gt;
        if (x1, y1) not in noduri:&lt;br /&gt;
            noduri[(x1, y1)] = index_nod&lt;br /&gt;
            index_nod += 1&lt;br /&gt;
        if (x2, y2) not in noduri:&lt;br /&gt;
            noduri[(x2, y2)] = index_nod&lt;br /&gt;
            index_nod += 1&lt;br /&gt;
&lt;br /&gt;
    num_noduri = len(noduri)&lt;br /&gt;
    dist = [[INF] * num_noduri for _ in range(num_noduri)]&lt;br /&gt;
&lt;br /&gt;
    # Setam distanta de la un nod la sine insusi la 0&lt;br /&gt;
    for i in range(num_noduri):&lt;br /&gt;
        dist[i][i] = 0&lt;br /&gt;
&lt;br /&gt;
    # Setam distantele initiale (doar distanta directa dintre noduri)&lt;br /&gt;
    for ((x1, y1), (x2, y2)) in echipaje:&lt;br /&gt;
        nod1 = noduri[(x1, y1)]&lt;br /&gt;
        nod2 = noduri[(x2, y2)]&lt;br /&gt;
        dist[nod1][nod2] = 1&lt;br /&gt;
        dist[nod2][nod1] = 1&lt;br /&gt;
    &lt;br /&gt;
    floyd_warshall(dist, num_noduri)&lt;br /&gt;
&lt;br /&gt;
    total_deplasari = 0&lt;br /&gt;
    for ((x1, y1), (x2, y2)) in echipaje:&lt;br /&gt;
        nod1 = noduri[(x1, y1)]&lt;br /&gt;
        nod2 = noduri[(x2, y2)]&lt;br /&gt;
        total_deplasari += dist[nod1][nod2]&lt;br /&gt;
    &lt;br /&gt;
    return total_deplasari&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultate(nume_fisier, total_deplasari):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{total_deplasari}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Main function&lt;br /&gt;
def main():&lt;br /&gt;
    p, echipaje = citire_date(&#039;date.in&#039;)&lt;br /&gt;
    total_deplasari = numar_minim_deplasari(p, echipaje)&lt;br /&gt;
    scrie_rezultate(&#039;date.out&#039;, total_deplasari)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3299_-_Mostenire_2&amp;diff=10186</id>
		<title>3299 - Mostenire 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3299_-_Mostenire_2&amp;diff=10186"/>
		<updated>2024-07-26T08:12:49Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Fibocel tocmai a moștenit o pădure gigantică de formă dreptunghiulară pe care vrea să o transforme într-un parc de distracții pentru copii. Cum își dă seama că este foarte mult de lucru și nu știe de unde să înceapă, s-a decis ca mai întâi să numere câte pădurici se află în pădurea moștenită. O pădurice este o suprafață dreptunghiulară înconjurată în totalitate de copaci, cu cel puțin o poieniță oriunde în interior. O poieniță este o su...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fibocel tocmai a moștenit o pădure gigantică de formă dreptunghiulară pe care vrea să o transforme într-un parc de distracții pentru copii. Cum își dă seama că este foarte mult de lucru și nu știe de unde să înceapă, s-a decis ca mai întâi să numere câte pădurici se află în pădurea moștenită. O pădurice este o suprafață dreptunghiulară înconjurată în totalitate de copaci, cu cel puțin o poieniță oriunde în interior. O poieniță este o suprafață fără copaci. Cum Fibocel și-a dat seama că și acest lucru este dificil de realizat, s-a decis să vă ceară vouă ajutorul!&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se pădurea moștenită de Fibocel sub forma unui dreptunghi cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; coloane având doar valori de &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; înseamnă suprafață fără copac iar &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; înseamnă suprafață cu copac, spuneți câte pădurici se regăsesc în interiorul pădurii moștenite.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;mostenire.in&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; separate prin exact un spațiu reprezentând dimensiunea pădurii. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se găsesc exact &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; caractere fără spațiu între ele, având doar valori de &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;mostenire.out&amp;lt;/code&amp;gt; va conține un număr reprezentând răspunsul cerut de Fibocel.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Păduricile se pot intersecta între ele.&lt;br /&gt;
* Pentru 15% dintre teste &amp;lt;code&amp;gt;N, M ≤ 30&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru alte 35% dintre teste, &amp;lt;code&amp;gt;M ≤ 100&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;mostenire.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 4&lt;br /&gt;
 1111&lt;br /&gt;
 1010&lt;br /&gt;
 1111&lt;br /&gt;
 1010&lt;br /&gt;
 1110&lt;br /&gt;
&amp;lt;code&amp;gt;mostenire.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire_date(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;r&#039;) as f:&lt;br /&gt;
        N, M = map(int, f.readline().split())&lt;br /&gt;
        matrice = [list(map(int, f.readline().split())) for _ in range(N)]&lt;br /&gt;
    return N, M, matrice&lt;br /&gt;
&lt;br /&gt;
def verifica_dreptunghi(matrice, x1, y1, x2, y2):&lt;br /&gt;
    # Verificam marginile dreptunghiului&lt;br /&gt;
    for i in range(x1, x2 + 1):&lt;br /&gt;
        if matrice[i][y1] != 1 or matrice[i][y2] != 1:&lt;br /&gt;
            return False&lt;br /&gt;
    for j in range(y1, y2 + 1):&lt;br /&gt;
        if matrice[x1][j] != 1 or matrice[x2][j] != 1:&lt;br /&gt;
            return False&lt;br /&gt;
    &lt;br /&gt;
    # Verificam daca exista cel putin un 0 in interior&lt;br /&gt;
    for i in range(x1 + 1, x2):&lt;br /&gt;
        for j in range(y1 + 1, y2):&lt;br /&gt;
            if matrice[i][j] == 0:&lt;br /&gt;
                return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def numara_padurici(N, M, matrice):&lt;br /&gt;
    numar_padurici = 0&lt;br /&gt;
    &lt;br /&gt;
    for x1 in range(N):&lt;br /&gt;
        for y1 in range(M):&lt;br /&gt;
            for x2 in range(x1 + 1, N):&lt;br /&gt;
                for y2 in range(y1 + 1, M):&lt;br /&gt;
                    if verifica_dreptunghi(matrice, x1, y1, x2, y2):&lt;br /&gt;
                        numar_padurici += 1&lt;br /&gt;
    &lt;br /&gt;
    return numar_padurici&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultate(nume_fisier, numar_padurici):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{numar_padurici}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Main function&lt;br /&gt;
def main():&lt;br /&gt;
    N, M, matrice = citire_date(&#039;date.in&#039;)&lt;br /&gt;
    numar_padurici = numara_padurici(N, M, matrice)&lt;br /&gt;
    scrie_rezultate(&#039;date.out&#039;, numar_padurici)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1033_-_Elicop&amp;diff=10185</id>
		<title>1033 - Elicop</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1033_-_Elicop&amp;diff=10185"/>
		<updated>2024-07-26T08:11:44Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Un teren de fotbal este folosit pentru aterizarea elicopterelor. Gazonul de pe stadion este parcelat în pătrăţele de aceeaşi dimensiune, cu laturile paralele cu marginile terenului. Liniile cu pătrăţele de gazon sunt numerotate de sus în jos cu numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, iar coloanele cu pătrăţele de gazon sunt numerotate de la stânga la dreapta cu numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Din cauza tipului d...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un teren de fotbal este folosit pentru aterizarea elicopterelor. Gazonul de pe stadion este parcelat în pătrăţele de aceeaşi dimensiune, cu laturile paralele cu marginile terenului. Liniile cu pătrăţele de gazon sunt numerotate de sus în jos cu numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, iar coloanele cu pătrăţele de gazon sunt numerotate de la stânga la dreapta cu numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Din cauza tipului diferit de iarbă se ştie care dintre pătrăţele de gazon  sunt afectate sau nu de umbră. Acest lucru este precizat printr-un tablou bidimensional a cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane, cu elemente &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;a&amp;lt;sup&amp;gt;ij&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= 0&amp;lt;/code&amp;gt; înseamnă că pătrăţelul aflat pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; este afectat de umbră, iar  &amp;lt;code&amp;gt;a&amp;lt;sup&amp;gt;ij&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= 1&amp;lt;/code&amp;gt; înseamnă că pătrăţelul aflat pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; nu este afectat de umbră).  Fiecare elicopter are &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; roţi pe care se sprijină. Roţile fiecărui elicopter determină un triunghi dreptunghic isoscel. Elicopterele aterizează, astfel încât triunghiurile formate să fie cu catetele paralele cu marginile terenului. În exemplul următor avem patru elicoptere.&lt;br /&gt;
&lt;br /&gt;
Pentru a preciza poziţia unui elicopter pe teren este suficient să cunoaştem linia şi coloana vărfurilor ipotenuzei şi poziţia vârfului deasupra (codificată prin &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) sau dedesubtul ipotenuzei (codificată prin &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;). Pentru exemplu, elicopterul din stânga sus este dat prin &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(3,3)&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;, cel din dreapta sus prin &amp;lt;code&amp;gt;(1,9)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(5,5)&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, cel din stânga jos prin &amp;lt;code&amp;gt;(5,1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(6,2)&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, iar cel din dreapta jos prin &amp;lt;code&amp;gt;(5,9)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(6,8)&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Un elicopter se consideră că a aterizat &#039;&#039;greşit&#039;&#039;, dacă triunghiul format sub el (definit mai sus) are mai mult de jumătate din pătrăţele afectate de umbră.&lt;br /&gt;
&lt;br /&gt;
Administratorul terenului de fotbal doreşte să determine numărul &amp;lt;code&amp;gt;N1&amp;lt;/code&amp;gt; de elicoptere, care nu afectează nici un pătrăţel din teren şi numerele de ordine al elicopterelor, care au aterizat &#039;&#039;greşit&#039;&#039; în ordine crescătoare: &amp;lt;code&amp;gt;e&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;e&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;e&amp;lt;sub&amp;gt;N2&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, ştiind că există &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; elicoptere codificate prin numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care să determine, pentru fişierul cu datele din enunţ: numărul de elicoptere &amp;lt;code&amp;gt;N1&amp;lt;/code&amp;gt;, care nu afectează nici un pătrăţel din teren şi numerele de ordine al elicopterelor, care au aterizat &#039;&#039;greşit&#039;&#039; în ordine crescătoare, precedate de numărul lor &amp;lt;code&amp;gt;N2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;elicop.in&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, separate printr-un spaţiu, cu semnificaţia din enunţ. Următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conţin câte &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, separate prin câte un spaţiu cu semnificaţia &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – pătrăţel de gazon care este afectat de umbră, respectiv &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;- pătrăţel care nu este afectat de umbră. Pe linia &amp;lt;code&amp;gt;m+2&amp;lt;/code&amp;gt; se află numărul de elicoptere &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii (în ordinea codificării lor &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;) câte cinci numere separate prin cate un spaţiu, pentru liniile şi coloanele ipotenuzelor şi poziţia vârfului (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;), triunghiurilor dreptunghice asociate elicopterelor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;L1 C1 L2 C2 p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;elicop.out&amp;lt;/code&amp;gt; va conține două linii: prima linie numărul &amp;lt;code&amp;gt;N1&amp;lt;/code&amp;gt; de elicoptere, care nu afectează nici un pătrăţel din teren, a doua linie cu numerele naturale &amp;lt;code&amp;gt;N2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;e&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;e&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;e&amp;lt;sub&amp;gt;N2&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; separate prin câte un spaţiu, în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ m,n ≤ 100&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;1 ≤ k ≤ 40&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nu există suprapuneri de triunghiuri asociate la două elicoptere. Triunghiurile asociate elicopterelor conţin cel puţin trei pătrăţele.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;elicop.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 9&lt;br /&gt;
 1 1 1 1 1 1 1 1 1&lt;br /&gt;
 0 0 0 0 1 1 1 1 0&lt;br /&gt;
 0 0 1 0 1 1 1 0 0&lt;br /&gt;
 1 1 1 0 1 1 0 1 1&lt;br /&gt;
 0 0 1 1 1 1 0 1 1&lt;br /&gt;
 1 1 1 1 1 1 0 1 1&lt;br /&gt;
 1 1 1 1 1 1 0 0 1&lt;br /&gt;
 4&lt;br /&gt;
 1 1 3 3 -1&lt;br /&gt;
 1 9 5 5 1&lt;br /&gt;
 5 1 6 2 1&lt;br /&gt;
 5 9 6 8 1 &lt;br /&gt;
&amp;lt;code&amp;gt;elicop.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 2 1 3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Elicopterele &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; nu afectează niciun pătrăţel de gazon.&lt;br /&gt;
&lt;br /&gt;
Elicopterele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; afectează fiecare mai mult de jumătate din numărul pătrăţelelor asociate triunghiurilor dreptunghice şi deci aterizează greşit. Elicopterul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; face umbră la &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; pătrăţele, din care afectate sunt &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Elicopterul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; face umbră la &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; pătrăţele, din care afectate sunt două.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire_date(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;r&#039;) as f:&lt;br /&gt;
        m, n = map(int, f.readline().split())&lt;br /&gt;
        a = [list(map(int, f.readline().split())) for _ in range(m)]&lt;br /&gt;
        k = int(f.readline())&lt;br /&gt;
        elicoptere = []&lt;br /&gt;
        for _ in range(k):&lt;br /&gt;
            lin1, col1, lin2, col2, poz = map(int, f.readline().split())&lt;br /&gt;
            elicoptere.append((lin1, col1, lin2, col2, poz))&lt;br /&gt;
    return m, n, a, k, elicoptere&lt;br /&gt;
&lt;br /&gt;
def triunghi_umbre(m, n, a, lin1, col1, lin2, col2, poz):&lt;br /&gt;
    umbite = 0&lt;br /&gt;
    total = 0&lt;br /&gt;
    if poz == 1:&lt;br /&gt;
        for i in range(lin1, lin2+1):&lt;br /&gt;
            for j in range(col1, col2+1):&lt;br /&gt;
                total += 1&lt;br /&gt;
                if a[i-1][j-1] == 0:&lt;br /&gt;
                    umbite += 1&lt;br /&gt;
    else:&lt;br /&gt;
        for i in range(lin2, lin1+1):&lt;br /&gt;
            for j in range(col1, col2+1):&lt;br /&gt;
                total += 1&lt;br /&gt;
                if a[i-1][j-1] == 0:&lt;br /&gt;
                    umbite += 1&lt;br /&gt;
    return umbite, total&lt;br /&gt;
&lt;br /&gt;
def verifica_aterizari(m, n, a, k, elicoptere):&lt;br /&gt;
    n1 = 0&lt;br /&gt;
    elicoptere_gresite = []&lt;br /&gt;
    for idx, (lin1, col1, lin2, col2, poz) in enumerate(elicoptere, start=1):&lt;br /&gt;
        umbite, total = triunghi_umbre(m, n, a, lin1, col1, lin2, col2, poz)&lt;br /&gt;
        if umbite == 0:&lt;br /&gt;
            n1 += 1&lt;br /&gt;
        elif umbite &amp;gt; total / 2:&lt;br /&gt;
            elicoptere_gresite.append(idx)&lt;br /&gt;
    return n1, elicoptere_gresite&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultate(nume_fisier, n1, elicoptere_gresite):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{n1}\n&amp;quot;)&lt;br /&gt;
        f.write(f&amp;quot;{len(elicoptere_gresite)} {&#039; &#039;.join(map(str, elicoptere_gresite))}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Main function&lt;br /&gt;
def main():&lt;br /&gt;
    m, n, a, k, elicoptere = citire_date(&#039;date.in&#039;)&lt;br /&gt;
    n1, elicoptere_gresite = verifica_aterizari(m, n, a, k, elicoptere)&lt;br /&gt;
    scrie_rezultate(&#039;date.out&#039;, n1, elicoptere_gresite)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3007_-_Tort_1&amp;diff=10184</id>
		<title>3007 - Tort 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3007_-_Tort_1&amp;diff=10184"/>
		<updated>2024-07-26T06:19:24Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: De ziua lui, Gigel a primit un tort de formă dreptunghiulară, ornat cu un caroiaj ce împarte tortul în &amp;lt;code&amp;gt;m x n&amp;lt;/code&amp;gt; pătrate, în fiecare pătrat aflându-se câte o cireașă sau o căpșună. Caroiajul cu fructe este reprezentat printr-o matrice cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; însemnând cireaşă şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; căpşună. Sărbătoritul are dreptul să taie &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; felii de tort. O felie se poate obține prin tăierea după linii...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De ziua lui, Gigel a primit un tort de formă dreptunghiulară, ornat cu un caroiaj ce împarte tortul în &amp;lt;code&amp;gt;m x n&amp;lt;/code&amp;gt; pătrate, în fiecare pătrat aflându-se câte o cireașă sau o căpșună. Caroiajul cu fructe este reprezentat printr-o matrice cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; însemnând cireaşă şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; căpşună. Sărbătoritul are dreptul să taie &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; felii de tort. O felie se poate obține prin tăierea după liniile caroiajului, dintr-un capăt în celălalt, având lățimea egală cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, de pe oricare latură a tortului, codificate cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;. Gigel fiind mare amator de căpşuni vrea să taie cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; felii astfel încât numărul căpşunilor din aceste felii să fie cât mai mare. Spre exemplu, dacă tortul iniţial este reprezentat ca o matrice având &amp;lt;code&amp;gt;6 x 6&amp;lt;/code&amp;gt; linii şi coloane, după &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; tăieturi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; bucata rămasă şi feliile obţinute vor fi conform figurii alăturate.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se scrie un program care să determine numărul de posibilităţi de tăiere a &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; felii de tort, pentru a obţine un număr maxim de căpşuni. Două variante în care diferă doar ordinea de tăiere, dar rămâne aceeaşi bucată de tort, nu sunt considerate distincte. De exemplu, dacă numărul maxim de căpşuni se poate obţine prin una din variantele : &amp;lt;code&amp;gt;VSNNV&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;VVNSN&amp;lt;/code&amp;gt;, acestea nu sunt considerate distincte.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fişierului de intrare &amp;lt;code&amp;gt;tort.in&amp;lt;/code&amp;gt; sunt scrise dimensiunile tortului, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; al feliilor de tort tăiate de Gigel, separate prin câte un spaţiu. Pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii e descris caroiajul cu fructe printr-o matrice cu valori de &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Prima linie a fişierului &amp;lt;code&amp;gt;tort.out&amp;lt;/code&amp;gt; va conţine numărul maxim de căpşuni care poate fi obţinut din cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; felii de tort. Pe linia a doua se va găsi numărul de posibilităţi distincte de a obţine numărul maxim de căpşuni.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ m, n ≤ 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k &amp;lt; min(m, n)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;tort.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 6 3&lt;br /&gt;
 0 1 1 1 0 1&lt;br /&gt;
 1 0 0 0 0 1&lt;br /&gt;
 0 0 0 1 0 0&lt;br /&gt;
 0 1 0 1 0 1&lt;br /&gt;
 1 0 0 0 0 0&lt;br /&gt;
 1 1 1 0 0 1&lt;br /&gt;
&amp;lt;code&amp;gt;tort.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 10&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Tortul este format dintr-un caroiaj cu &amp;lt;code&amp;gt;m = 6&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n = 6&amp;lt;/code&amp;gt; coloane şi se pot tăia &amp;lt;code&amp;gt;k = 3&amp;lt;/code&amp;gt; felii. Se pot obţine maximum &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; căpşuni. Cele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; posibilităţi de a tăia cele trei felii sunt: &amp;lt;code&amp;gt;NNS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NSE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NSV&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VEV&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;NEV&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def count_strawberries(matrix):&lt;br /&gt;
    return sum(sum(row) for row in matrix)&lt;br /&gt;
&lt;br /&gt;
def cut_slice(matrix, direction):&lt;br /&gt;
    if direction == &#039;N&#039;:&lt;br /&gt;
        return matrix[0], matrix[1:]&lt;br /&gt;
    elif direction == &#039;S&#039;:&lt;br /&gt;
        return matrix[-1], matrix[:-1]&lt;br /&gt;
    elif direction == &#039;E&#039;:&lt;br /&gt;
        return [row[-1] for row in matrix], [row[:-1] for row in matrix]&lt;br /&gt;
    elif direction == &#039;V&#039;:&lt;br /&gt;
        return [row[0] for row in matrix], [row[1:] for row in matrix]&lt;br /&gt;
&lt;br /&gt;
def max_strawberries(matrix, k):&lt;br /&gt;
    from itertools import combinations_with_replacement&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    directions = [&#039;N&#039;, &#039;E&#039;, &#039;S&#039;, &#039;V&#039;]&lt;br /&gt;
    &lt;br /&gt;
    max_straws = 0&lt;br /&gt;
    for cuts in combinations_with_replacement(directions, k):&lt;br /&gt;
        temp_matrix = [row[:] for row in matrix]&lt;br /&gt;
        total_straws = 0&lt;br /&gt;
        for cut in cuts:&lt;br /&gt;
            slice_straws, temp_matrix = cut_slice(temp_matrix, cut)&lt;br /&gt;
            total_straws += sum(slice_straws)&lt;br /&gt;
        max_straws = max(max_straws, total_straws)&lt;br /&gt;
    &lt;br /&gt;
    return max_straws&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
matrix = [&lt;br /&gt;
    [0, 1, 0, 1, 0, 1],&lt;br /&gt;
    [1, 1, 0, 0, 1, 0],&lt;br /&gt;
    [0, 0, 1, 1, 0, 1],&lt;br /&gt;
    [1, 0, 0, 1, 1, 0],&lt;br /&gt;
    [0, 1, 1, 0, 0, 1],&lt;br /&gt;
    [1, 0, 1, 0, 1, 0]&lt;br /&gt;
]&lt;br /&gt;
k = 3&lt;br /&gt;
print(max_strawberries(matrix, k))  # Afișează numărul maxim de căpșuni care pot fi obținute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2558_-_Shootings&amp;diff=10183</id>
		<title>2558 - Shootings</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2558_-_Shootings&amp;diff=10183"/>
		<updated>2024-07-26T06:17:41Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: De când a început serviciul militar, Mihai nu și-a găsit vocația și a decis să-și încerce norocul încă o dată, mergând la superiorul său, Căpitanul Dan. De data aceasta,  Dan a fost mai amabil, dar i-a cerut  lui Mihai să demonstreze talentul său de trăgător.  Vom considera țintele din zona de tragere ca fiind dreptunghiuri în plan. Căpitanul îi indică lui Mihai câteva puncta pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; și direcțiile de tragere. Fiecare tragere este o se...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De când a început serviciul militar, Mihai nu și-a găsit vocația și a decis să-și încerce norocul încă o dată, mergând la superiorul său, Căpitanul Dan. De data aceasta,  Dan a fost mai amabil, dar i-a cerut  lui Mihai să demonstreze talentul său de trăgător.&lt;br /&gt;
&lt;br /&gt;
Vom considera țintele din zona de tragere ca fiind dreptunghiuri în plan. Căpitanul îi indică lui Mihai câteva puncta pe axa &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; și direcțiile de tragere. Fiecare tragere este o semidreaptă care poate fi orientată fie diagonal spre stânga la &amp;lt;code&amp;gt;45&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, fie diagonal spre dreapta la &amp;lt;code&amp;gt;45&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, fie pe verticală în sus.&lt;br /&gt;
&lt;br /&gt;
Definim costul atingerii unei ținte ca fiind lungimea intersecției semidreptei de tragere cu dreptunghiul care reprezintă ținta. Dacă intersecția este vidă, sau constă dintr-un singur punct, atunci costul este &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Definim costul unei trageri ca suma costurilor atingerilor tuturor țintelor.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinați costul fiecărei trageri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;shootings.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul de dreptunghiuri-ținte. Fiecare din următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, conține descrierea unui dreptunghi–țintă: patru numere naturale, &amp;lt;code&amp;gt;X1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Y1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Y2&amp;lt;/code&amp;gt;, care reprezintă coordonatele colțului din stânga-jos și dreapta-sus, respectiv. Cele partu numere sunt separate prin câte un spațiu. Urmează o linie care conține numărul natural &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, reprezentând numărul de împușcături. Fiecare din următoarele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii, conține două numere întregi &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, separate prin spațiu. Primul număr reprezintă coordonata &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; a punctului de tragere, cel de al doilea – direcția de tragere (&amp;lt;code&amp;gt;D = 1&amp;lt;/code&amp;gt; corespunde unei trageri verticale, &amp;lt;code&amp;gt;D = 2&amp;lt;/code&amp;gt; corespunde unei trageri diagonale spre stânga și &amp;lt;code&amp;gt;D = 3&amp;lt;/code&amp;gt; corespunde unei trageri diagonale spre dreapta).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;shootings.out&amp;lt;/code&amp;gt; are &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii. Fiecare linie conține un număr întreg non-negativ, care reprezintă pătratul costului unei trageri. Pătratele costurilor apar în fișierul de ieșire în aceeași ordine în care tragerile apar în fișierul de intrare. Reamintim că pentru fiecare din costurile determinate, se va scrie pătratul valorii sale.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 50000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ X1 &amp;lt; X2 ≤ 100000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ Y1 &amp;lt; Y2 ≤ 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-100000 ≤ P ≤ 200000&amp;lt;/code&amp;gt;&lt;br /&gt;
* toate laturile dreptunghiurilor sunt paralele axei &amp;lt;code&amp;gt;OX&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;OY&amp;lt;/code&amp;gt;&lt;br /&gt;
* oricare două dreptunghiuri nu se intersectează (nu au nici un punct comun) și nu există dreptunghiuri incluse unul în celălalt.&lt;br /&gt;
* dreptunghiurile pot fi pătrate&lt;br /&gt;
* dreptunghiurile au arie diferită de &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* pot exista trageri identice&lt;br /&gt;
* de remarcat că numerele din fișierul de ieșire sunt întregi, non-negative&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;shootings.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 1 1 4 3&lt;br /&gt;
 2 4 5 7&lt;br /&gt;
 6 3 10 5&lt;br /&gt;
 8 1 9 2&lt;br /&gt;
 2&lt;br /&gt;
 0 3&lt;br /&gt;
 9 1&lt;br /&gt;
&amp;lt;code&amp;gt;shootings.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 18&lt;br /&gt;
 9&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def calculate_intersection_length(rect, ray_origin, direction):&lt;br /&gt;
    x1, y1, x2, y2 = rect&lt;br /&gt;
    x0, y0 = ray_origin&lt;br /&gt;
&lt;br /&gt;
    if direction == &amp;quot;left&amp;quot;:&lt;br /&gt;
        # Equation of the line: y = -(x - x0) + y0 (negative slope)&lt;br /&gt;
        intersections = []&lt;br /&gt;
        # Check intersection with left side of the rectangle&lt;br /&gt;
        y = -(x1 - x0) + y0&lt;br /&gt;
        if y1 &amp;lt;= y &amp;lt;= y2:&lt;br /&gt;
            intersections.append((x1, y))&lt;br /&gt;
        # Check intersection with bottom side of the rectangle&lt;br /&gt;
        x = -(y1 - y0) + x0&lt;br /&gt;
        if x1 &amp;lt;= x &amp;lt;= x2:&lt;br /&gt;
            intersections.append((x, y1))&lt;br /&gt;
        # Check intersection with top side of the rectangle&lt;br /&gt;
        x = -(y2 - y0) + x0&lt;br /&gt;
        if x1 &amp;lt;= x &amp;lt;= x2:&lt;br /&gt;
            intersections.append((x, y2))&lt;br /&gt;
&lt;br /&gt;
    elif direction == &amp;quot;right&amp;quot;:&lt;br /&gt;
        # Equation of the line: y = (x - x0) + y0 (positive slope)&lt;br /&gt;
        intersections = []&lt;br /&gt;
        # Check intersection with right side of the rectangle&lt;br /&gt;
        y = (x2 - x0) + y0&lt;br /&gt;
        if y1 &amp;lt;= y &amp;lt;= y2:&lt;br /&gt;
            intersections.append((x2, y))&lt;br /&gt;
        # Check intersection with bottom side of the rectangle&lt;br /&gt;
        x = (y1 - y0) + x0&lt;br /&gt;
        if x1 &amp;lt;= x &amp;lt;= x2:&lt;br /&gt;
            intersections.append((x, y1))&lt;br /&gt;
        # Check intersection with top side of the rectangle&lt;br /&gt;
        x = (y2 - y0) + x0&lt;br /&gt;
        if x1 &amp;lt;= x &amp;lt;= x2:&lt;br /&gt;
            intersections.append((x, y2))&lt;br /&gt;
&lt;br /&gt;
    elif direction == &amp;quot;up&amp;quot;:&lt;br /&gt;
        # Vertical line upwards&lt;br /&gt;
        intersections = []&lt;br /&gt;
        # Check intersection with top side of the rectangle&lt;br /&gt;
        if x1 &amp;lt;= x0 &amp;lt;= x2:&lt;br /&gt;
            intersections.append((x0, y2))&lt;br /&gt;
        # Check intersection with bottom side of the rectangle&lt;br /&gt;
        if x1 &amp;lt;= x0 &amp;lt;= x2:&lt;br /&gt;
            intersections.append((x0, y1))&lt;br /&gt;
&lt;br /&gt;
    # Calculate length of intersection segment&lt;br /&gt;
    if len(intersections) == 2:&lt;br /&gt;
        (xA, yA), (xB, yB) = intersections&lt;br /&gt;
        return ((xB - xA)**2 + (yB - yA)**2)**0.5&lt;br /&gt;
    else:&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
def calculate_shooting_cost(rectangles, shots):&lt;br /&gt;
    costs = []&lt;br /&gt;
    for shot in shots:&lt;br /&gt;
        origin, direction = shot&lt;br /&gt;
        total_cost = 0&lt;br /&gt;
        for rect in rectangles:&lt;br /&gt;
            total_cost += calculate_intersection_length(rect, origin, direction)&lt;br /&gt;
        costs.append(total_cost)&lt;br /&gt;
    return costs&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
rectangles = [&lt;br /&gt;
    (1, 1, 4, 4),  # dreptunghi definit prin (x1, y1, x2, y2)&lt;br /&gt;
    (5, 3, 7, 5)&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
shots = [&lt;br /&gt;
    ((2, 0), &amp;quot;left&amp;quot;),   # tragere de la (2, 0) în direcția diagonală stânga&lt;br /&gt;
    ((6, 0), &amp;quot;right&amp;quot;),  # tragere de la (6, 0) în direcția diagonală dreapta&lt;br /&gt;
    ((3, 0), &amp;quot;up&amp;quot;)      # tragere de la (3, 0) în direcția verticală în sus&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
costs = calculate_shooting_cost(rectangles, shots)&lt;br /&gt;
for i, cost in enumerate(costs):&lt;br /&gt;
    print(f&amp;quot;Costul tragerii {i+1}: {cost}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2439_-_T_Bile&amp;diff=10182</id>
		<title>2439 - T Bile</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2439_-_T_Bile&amp;diff=10182"/>
		<updated>2024-07-26T06:15:48Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Roboțelul Nino a primit cadou un dispozitiv care inscripționează bile. Dispozitivul poate fi încărcat cu n bile, ce vor fi inscripționate în ordine, cu numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  Nino trebuie să împartă bilele inscripționate în două șiruri, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, astfel:  - La primul pas Nino va pune în primul șir bila cu numărul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;X[1] = 1&amp;lt;/code&amp;gt;), iar în al doilea șir bila cu numărul &amp;lt;co...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Roboțelul Nino a primit cadou un dispozitiv care inscripționează bile. Dispozitivul poate fi încărcat cu n bile, ce vor fi inscripționate în ordine, cu numerele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nino trebuie să împartă bilele inscripționate în două șiruri, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, astfel:&lt;br /&gt;
&lt;br /&gt;
- La primul pas Nino va pune în primul șir bila cu numărul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;X[1] = 1&amp;lt;/code&amp;gt;), iar în al doilea șir bila cu numărul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Y[1] = 2&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
- La al doilea pas Nino va pune în primul șir bila cu numărul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;X[2] = 3&amp;lt;/code&amp;gt;), iar în al doilea șir bila cu numărul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Y[2] = 4&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
- La fiecare pas &amp;lt;code&amp;gt;i ≥ 3&amp;lt;/code&amp;gt; Nino va pune în șirul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; bila &amp;lt;code&amp;gt;X[i] = X[i-1] + Y[i-1]&amp;lt;/code&amp;gt;, iar în șirul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, în ordine crescătoare, bilele numerotate cu &amp;lt;code&amp;gt;X[i-1]+1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X[i-1]+2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;X[i]-1&amp;lt;/code&amp;gt;, cu excepția bilei &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; care a fost pusă deja.&lt;br /&gt;
&lt;br /&gt;
Dacă la un pas &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X[k] &amp;gt; n&amp;lt;/code&amp;gt;, bilele rămase vor fi inscripționate cu valorile &amp;lt;code&amp;gt;X[k-1]+1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X[k-1]+2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și vor fi puse în șirul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru că bilele se rostogolesc, Nino împachetează în tuburi verticale de culoare galbenă, bilele din primul șir, iar în tuburi verticale de culoare roșie, bilele din al doilea șir. În fiecare tub încap cel mult &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; bile, dispuse pe o singură coloană. Tuburile sunt așezate vertical, întâi cele galbene, în ordinea umplerii, apoi cele roșii în ordinea umplerii lor. Bilele de la baza fiecărui tub formează nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, cele situate imediat deasupra lor formează nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; etc., nivelul maxim putând fi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dau numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și se cere să se determine:&lt;br /&gt;
&lt;br /&gt;
1. Numărul de tuburi de culoare roșie necesare pentru a împacheta bilele din șirul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; și numărul total de bile conținute de acestea.&lt;br /&gt;
&lt;br /&gt;
2. Pentru un nivel &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; dat, suma numerelor inscripționate pe bilele de pe nivelul &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;tbile.in&amp;lt;/code&amp;gt; conţine pe prima linie un număr natural &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; reprezentând cerința care trebuie să fie rezolvată (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), pe a doua linie un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând numărul de bile ce se inscripționează, iar pe cea de a treia linie un număr natural &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de bile care încap într-un tub. Dacă cerința este &amp;lt;code&amp;gt;c = 2&amp;lt;/code&amp;gt;, fișierul de intrare conține, în plus, pe a patra linie, un număr natural &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; reprezentând numărul unui nivel.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă cerința este &amp;lt;code&amp;gt;c = 1&amp;lt;/code&amp;gt;, atunci, pe prima linie a fișierului &amp;lt;code&amp;gt;tbile.out&amp;lt;/code&amp;gt;, vor fi scrise două numere naturale, separate printr-un spațiu, reprezentând, în această ordine, numărul de tuburi de culoare roșie necesare pentru a împacheta bilele din șirul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, respectiv, numărul total de bile conținute de acestea.&lt;br /&gt;
&lt;br /&gt;
Dacă cerința este &amp;lt;code&amp;gt;c = 2&amp;lt;/code&amp;gt;, atunci, pe prima linie a fișierului &amp;lt;code&amp;gt;tbile.out&amp;lt;/code&amp;gt; va fi scris un număr natural reprezentând suma numerelor inscripționate pe bilele de pe nivelul &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;5 ≤ n ≤ 2 000 000 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ c ≤ m ≤ 311445015&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se acordă &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte pentru rezolvarea corectă a cerinței 1 și &amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt; de puncte pentru rezolvarea corectă a cerinței 2.&lt;br /&gt;
* În concurs s-au acordat &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte din oficiu. Aici se acordă punctele pentru exemplele din enunț.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;tbile.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 36&lt;br /&gt;
 5&lt;br /&gt;
&amp;lt;code&amp;gt;tbile.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 29&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Primul șir va conține &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; bile (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;35&amp;lt;/code&amp;gt;), iar cel de al doilea &amp;lt;code&amp;gt;36-7=29&amp;lt;/code&amp;gt; de bile (ca în figura de mai sus). Sunt necesare &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; tuburi de capacitate &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;tbile.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 36&lt;br /&gt;
 5&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;tbile.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 126&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; se găsesc bilele inscripționate cu numerele &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;34&amp;lt;/code&amp;gt;. Suma acestor valori este &amp;lt;code&amp;gt;126&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def calculate_balls_and_tubes(n, m, v):&lt;br /&gt;
    # Initialize X and Y&lt;br /&gt;
    X = [1]&lt;br /&gt;
    Y = [2]&lt;br /&gt;
    current_num = 3&lt;br /&gt;
&lt;br /&gt;
    # Build X and Y sequences&lt;br /&gt;
    while True:&lt;br /&gt;
        if len(X) &amp;lt; 2:&lt;br /&gt;
            X.append(current_num)&lt;br /&gt;
            current_num += 1&lt;br /&gt;
        else:&lt;br /&gt;
            next_x = X[-1] + Y[-1]&lt;br /&gt;
            if next_x &amp;gt; n:&lt;br /&gt;
                break&lt;br /&gt;
            X.append(next_x)&lt;br /&gt;
            for i in range(X[-2] + 1, next_x):&lt;br /&gt;
                if i != 4:&lt;br /&gt;
                    Y.append(i)&lt;br /&gt;
            current_num = next_x + 1&lt;br /&gt;
&lt;br /&gt;
    # Add remaining balls to Y&lt;br /&gt;
    for i in range(X[-1] + 1, n + 1):&lt;br /&gt;
        if i != 4:&lt;br /&gt;
            Y.append(i)&lt;br /&gt;
&lt;br /&gt;
    # Number of red tubes and total balls in Y&lt;br /&gt;
    red_tubes = (len(Y) + m - 1) // m&lt;br /&gt;
    total_balls_in_red_tubes = len(Y)&lt;br /&gt;
&lt;br /&gt;
    # Calculate the sum of the numbers on level v&lt;br /&gt;
    sum_on_level_v = 0&lt;br /&gt;
&lt;br /&gt;
    # Yellow tubes (X balls)&lt;br /&gt;
    for i in range(len(X)):&lt;br /&gt;
        if (i // m) + 1 == v:&lt;br /&gt;
            sum_on_level_v += X[i]&lt;br /&gt;
&lt;br /&gt;
    # Red tubes (Y balls)&lt;br /&gt;
    for i in range(len(Y)):&lt;br /&gt;
        if (i // m) + 1 == v:&lt;br /&gt;
            sum_on_level_v += Y[i]&lt;br /&gt;
&lt;br /&gt;
    return red_tubes, total_balls_in_red_tubes, sum_on_level_v&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
n = 10  # numărul total de bile&lt;br /&gt;
m = 3   # capacitatea unui tub&lt;br /&gt;
v = 2   # nivelul dorit&lt;br /&gt;
&lt;br /&gt;
red_tubes, total_balls_in_red_tubes, sum_on_level_v = calculate_balls_and_tubes(n, m, v)&lt;br /&gt;
print(f&amp;quot;Numărul de tuburi roșii necesare: {red_tubes}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul total de bile din tuburile roșii: {total_balls_in_red_tubes}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Suma numerelor inscripționate pe bilele de pe nivelul {v}: {sum_on_level_v}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2010_-_Fermier&amp;diff=10181</id>
		<title>2010 - Fermier</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2010_-_Fermier&amp;diff=10181"/>
		<updated>2024-07-26T06:14:04Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Dorel și-a achiziționat o fermă cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; plantații și o mașină de transport cu o capacitate &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, pentru transportul de îngrășăminte la toate plantațiile. Îngrășămintele se află într-un depozit, în cantitate suficientă pentru scopul propus. Plantațiile și depozitul sunt dispuse sub forma unui cerc. Există drumuri doar între plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și plantația &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1≤i≤n-1&amp;lt;/code&amp;gt;), precum și între depozit...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dorel și-a achiziționat o fermă cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; plantații și o mașină de transport cu o capacitate &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, pentru transportul de îngrășăminte la toate plantațiile. Îngrășămintele se află într-un depozit, în cantitate suficientă pentru scopul propus. Plantațiile și depozitul sunt dispuse sub forma unui cerc. Există drumuri doar între plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și plantația &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1≤i≤n-1&amp;lt;/code&amp;gt;), precum și între depozit și plantația &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și depozit și plantația &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, ca în figură.&lt;br /&gt;
&lt;br /&gt;
La o plantație &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; se poate ajunge de la depozit trecând prin plantațiile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt; sau prin plantațiile &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;, alegerea făcându-se în funcție de traseul cel mai scurt. Se cunosc aceste distanțe, precum și cantitatea de îngrășăminte necesară pentru fiecare plantație. La fiecare încărcare, Dorel ia din depozit exact cantitatea &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Dorel vrea să-și organizeze bine munca la fermă și să consume cât mai puțină benzină prin alegerea celor mai scurte trasee de parcurs. Plantațiile trebuie să fie aprovizionate obligatoriu în ordinea următoare: mai întâi plantația &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, apoi plantația &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, plantația &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;,…, plantația &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  În plus, și-a propus să încarce o nouă cantitate de îngrășământ doar după ce a folosit toată cantitatea încărcată anterior. Transportarea îngrășămintelor pe plantații se face deci, începând cu plantația &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. După ce se transportă toată cantitatea necesară pentru această plantație, se trece la plantația &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, și tot așa în ordine la &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; etc. până se deservește ultima plantație. Dacă după ce s-au transportat îngrășămintele necesare pentru plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; în mașină au mai rămas încă îngrășăminte, acestea trebuie utilizate în continuare pentru alte plantații, alese în ordinea impusă (începând cu plantația &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;, apoi &amp;lt;code&amp;gt;i+2&amp;lt;/code&amp;gt; etc.), până se epuizează toată cantitatea transportată de mașină.  Astfel, dacă de la plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; trebuie să ajungă la plantația &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;, va alege cel mai scurt traseu dintre traseul direct de la plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; și traseul care trece prin plantațiile &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i-2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, depozit, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;. La final, mașina trebuie să se întoarcă la depozit, goală sau cu cantitatea rămasă după aprovizionarea cu îngrășăminte a plantației &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Ajutați-l pe Dorel să calculeze distanța parcursă pentru a transporta îngrășăminte la toate cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; plantații, conform cerințelor.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;fermier.in&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, separate printr-un spațiu. A doua linie conține numerele naturale &amp;lt;code&amp;gt;d[0]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d[2]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;d[n-1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d[n]&amp;lt;/code&amp;gt; separate două câte două prin câte un spaţiu, unde &amp;lt;code&amp;gt;d[0]&amp;lt;/code&amp;gt; este distanța dintre prima plantație și depozit, &amp;lt;code&amp;gt;d[i]&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1≤i≤n-1&amp;lt;/code&amp;gt;) este distanța între plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și plantația &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;d[n]&amp;lt;/code&amp;gt; este distanța dintre plantația &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și depozit. Pe linia a treia se găsesc numerele naturale &amp;lt;code&amp;gt;q[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q[2]&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;q[n-1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q[n]&amp;lt;/code&amp;gt; separate  două câte două prin câte un spaţiu, &amp;lt;code&amp;gt;q[i]&amp;lt;/code&amp;gt; reprezentând cantitatea de îngrășăminte necesară pentru plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1≤i≤n&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;fermier.out&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural conform cerinţei.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 2&amp;lt;/code&amp;gt;, pentru teste în valoare de 20 de puncte;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ d[i] ≤ 1000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ n&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ q[i] ≤ 1000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ n&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤  c ≤ 1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* În concurs s-au acordat  10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemplu.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;fermier.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 6&lt;br /&gt;
 1 10 2 3&lt;br /&gt;
 13 2 7&lt;br /&gt;
&amp;lt;code&amp;gt;fermier.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 22&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
La plantația &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; trebuie transportată o cantitate egală cu &amp;lt;code&amp;gt;13&amp;lt;/code&amp;gt;, valoarea maximă pe care o poate transporta mașina fiind de &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. La plantația &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; se ajunge pe drumul cel mai scurt direct de la depozit. Astfel se va merge mai întâi cu cantitatea &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, ne întoarcem la depozit, încărcam iar mașina, ducem &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, ne întoarcem, încărcăm și lăsăm doar &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (atât mai este necesar). Pentru aceasta, s-a parcurs distanța de &amp;lt;code&amp;gt;1+1+1+1+1=5&amp;lt;/code&amp;gt;. În mașină a mai rămas acum o cantitate egală cu &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. Trebuie să mergem acum la plantația &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; pe drumul cel mai scurt. Pe drumul direct distanța este &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, iar pe drumul invers care trece iar prin depozit este &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1+3+2&amp;lt;/code&amp;gt;). Vom alege drumul cu distanța &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. Lăsăm cantitatea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (atât e necesar plantației &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), ne mai rămân &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și pentru plantația &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. De la plantația &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; se ajunge direct la plantația &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; pe o distanță egală cu &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; sau invers, trecând prin depozit pe o distanță de &amp;lt;code&amp;gt;14&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;10+1+3&amp;lt;/code&amp;gt;). Alegem drumul cu distanța &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Lăsăm îngrășămintele rămase și mai mergem iar la depozit, încărcăm și lăsăm &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; la plantația &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Pentru aceasta mai parcurgem distanța &amp;lt;code&amp;gt;3+3&amp;lt;/code&amp;gt;. La final mașina trebuie să se întoarcă la depozit, deci încă un drum cu distanța &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. În total: &amp;lt;code&amp;gt;5+6+2+6+3=22&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def shortest_distance(depot_to_1, depot_to_n, distances, c, requirements):&lt;br /&gt;
    n = len(requirements)&lt;br /&gt;
    total_distance = 0&lt;br /&gt;
    current_fertilizer = 0&lt;br /&gt;
&lt;br /&gt;
    # Helper function to calculate shortest path between two plantations&lt;br /&gt;
    def calculate_shortest_path(i, j):&lt;br /&gt;
        if i &amp;lt; j:&lt;br /&gt;
            direct_path = sum(distances[i:j])&lt;br /&gt;
        else:&lt;br /&gt;
            direct_path = sum(distances[j:i])&lt;br /&gt;
        through_depot = depot_to_1 + depot_to_n&lt;br /&gt;
        return min(direct_path, through_depot)&lt;br /&gt;
&lt;br /&gt;
    # Start from depot to the first plantation&lt;br /&gt;
    total_distance += depot_to_1&lt;br /&gt;
    current_index = 0&lt;br /&gt;
&lt;br /&gt;
    while current_index &amp;lt; n:&lt;br /&gt;
        # If not enough fertilizer, go back to depot&lt;br /&gt;
        if current_fertilizer &amp;lt; requirements[current_index]:&lt;br /&gt;
            total_distance += depot_to_1  # Return to depot&lt;br /&gt;
            current_fertilizer = c&lt;br /&gt;
            total_distance += depot_to_1  # Go back to the current plantation&lt;br /&gt;
&lt;br /&gt;
        # Fulfill the current plantation&#039;s requirement&lt;br /&gt;
        while current_index &amp;lt; n and current_fertilizer &amp;gt;= requirements[current_index]:&lt;br /&gt;
            current_fertilizer -= requirements[current_index]&lt;br /&gt;
            current_index += 1&lt;br /&gt;
            if current_index &amp;lt; n:&lt;br /&gt;
                total_distance += calculate_shortest_path(current_index - 1, current_index)&lt;br /&gt;
&lt;br /&gt;
    # Return to depot after the last plantation&lt;br /&gt;
    total_distance += depot_to_1&lt;br /&gt;
&lt;br /&gt;
    return total_distance&lt;br /&gt;
&lt;br /&gt;
# Example of usage:&lt;br /&gt;
depot_to_1 = 10&lt;br /&gt;
depot_to_n = 15&lt;br /&gt;
distances = [5, 8, 10, 12, 6]  # Distances between consecutive plantations&lt;br /&gt;
c = 20  # Capacity of the truck&lt;br /&gt;
requirements = [5, 10, 8, 12, 6]  # Fertilizer requirements for each plantation&lt;br /&gt;
&lt;br /&gt;
result = shortest_distance(depot_to_1, depot_to_n, distances, c, requirements)&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1492_-_Bunicul&amp;diff=10180</id>
		<title>1492 - Bunicul</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1492_-_Bunicul&amp;diff=10180"/>
		<updated>2024-07-26T06:12:12Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: _”Se scutură din salcâmi o ploaie de miresme.   Bunicul stă pe prispă. Se gândește. La ce se gândește? La nimic. Înnumără florile care cad. Se uită-n fundul grădinii. Se scarpină-n cap. Iar înnumără florile scuturate de adiere. Pletele lui albe și crețe parcă sunt niște ciorchini de flori albe; sprâncenele, mustățile, barba… peste toate au nins anii mulți și grei.  Numai ochii bunicului au rămas ca odinioară: blânzi și mângâietori. Cine tr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;_”Se scutură din salcâmi o ploaie de miresme. &lt;br /&gt;
&lt;br /&gt;
Bunicul stă pe prispă. Se gândește. La ce se gândește? La nimic. Înnumără florile care cad. Se uită-n fundul grădinii. Se scarpină-n cap. Iar înnumără florile scuturate de adiere. Pletele lui albe și crețe parcă sunt niște ciorchini de flori albe; sprâncenele, mustățile, barba… peste toate au nins anii mulți și grei.&lt;br /&gt;
&lt;br /&gt;
Numai ochii bunicului au rămas ca odinioară: blânzi și mângâietori. Cine trânti poarta?&lt;br /&gt;
&lt;br /&gt;
– O, voinicii moșului!… &lt;br /&gt;
&lt;br /&gt;
Un băietan ș-o fetiță, roșii și bucălai, sărutară mânele lui „tata-moșu”. Bătrânul coprinse într-o mână pe fată și în cealaltă pe băiat.&lt;br /&gt;
&lt;br /&gt;
– La ce te gândești bunicule?” (Barbu Ștefănescu Delavrancea – &#039;&#039;&#039;”Bunicul”&#039;&#039;&#039;)_&lt;br /&gt;
&lt;br /&gt;
Numărând florile, mă gândeam la execuția unui program care calculează formula fericirii. Am o problemă cu alocarea memoriei. În unele cazuri programul poate rula, iar în altele nu. Programul funcționează corect dacă se alocă memorie în primul spațiu liber din zona de date, în ordinea în care variabilele sunt declarate. De asemenea, adresa de memorie a unei variabile succede adresa de memorie a oricărei variabile declarate înaintea ei.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând dimensiunea memoriei &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, numărul de zone ocupate &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, numărul &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; de variabile declarate, cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; intervalele de memorie ocupate, precum și spațiul ocupat de fiecare din cele &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; variabile, să se determine:&lt;br /&gt;
&lt;br /&gt;
a) Dimensiunea totală disponibilă pentru variabilele folosite.&lt;br /&gt;
&lt;br /&gt;
b) Adresele de memorie pentru fiecare variabilă în parte în cazul în care alocarea memoriei este posibilă, respectând cerința problemei, sau numărul de variabile ce au putut fi alocate și adresa maximă la care este salvată o variabilă de memorie.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;bunicul.in&amp;lt;/code&amp;gt; conține pe prima linie , despărțite printr-un spațiu, trei numere naturale &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii câte două numere reprezentând intervalele de memorie ocupată. Pe linia &amp;lt;code&amp;gt;N+2&amp;lt;/code&amp;gt; sunt cele &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; numere reprezentând spațiul ocupat de fiecare variabilă în parte în ordinea în care vor fi alocate.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;bunicul.out&amp;lt;/code&amp;gt; va conține dimensiunea totală disponibilă pentru variabilele folosite, iar pe a doua linie &amp;lt;code&amp;gt;2*R&amp;lt;/code&amp;gt; numere reprezentând intervalul de memorie pentru fiecare variabilă în parte sau două numere reprezentând numărul de variabile pentru care s-a putut aloca memorie și ultima locație de memorie ocupată de variabilele pentru care s-a alocat memorie.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 2.000.000.000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ N ≤ 10.000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ R ≤ 10.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Variabilele ocupă cel mult &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
* Prima adresă la care pot fi încărcate datele este &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Toate variabilele sunt declarate în așa fel încât să nu depășească memoria disponibilă.&lt;br /&gt;
* Intervalele de memorie ocupată nu sunt date obligatoriu în ordinea adreselor lor.&lt;br /&gt;
* Intervalele ale memorie ocupată nu se suprapun.&lt;br /&gt;
* Dimensiunea &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; a memoriei este exprimată în bytes. Dimensiunile variabilelor sunt exprimate de asemenea în bytes. Toate aceste valori sunt numere naturale.&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerințe, se acordă 20% din punctaj, iar pentru rezolvarea corectă a celei de-a doua cerințe, se acordă 80% din punctaj.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;bunicul.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1300 9 7&lt;br /&gt;
 46 100&lt;br /&gt;
 130 180&lt;br /&gt;
 200 300&lt;br /&gt;
 349 450&lt;br /&gt;
 501 607&lt;br /&gt;
 670 750&lt;br /&gt;
 800 802&lt;br /&gt;
 900 902&lt;br /&gt;
 1010 1050&lt;br /&gt;
 30 20 50 35 60 100 100&lt;br /&gt;
&amp;lt;code&amp;gt;bunicul.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 757&lt;br /&gt;
 0 29 101 120 451 500 608 642 803 862 903 1002 1051 1150&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Spațiul total liber este de &amp;lt;code&amp;gt;757&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
&lt;br /&gt;
* Prima zonă liberă este cuprinsă între adresele &amp;lt;code&amp;gt;0 45&amp;lt;/code&amp;gt;. Prima variabilă ocupă &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; bytes, spațiul alocat este intervalul &amp;lt;code&amp;gt;0,29&amp;lt;/code&amp;gt;.&lt;br /&gt;
* A doua variabilă are &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; bytes. Prima zonă liberă de dimensiunea dorită este cuprinsă în intervalul &amp;lt;code&amp;gt;101,120&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru a treia variabilă, care are &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; bytes, se va aloca memoria cuprinsă între &amp;lt;code&amp;gt;451,500&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru a patra variabilă se vor aloca &amp;lt;code&amp;gt;35&amp;lt;/code&amp;gt; bytes între adresele &amp;lt;code&amp;gt;608,642&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru a cincea variabilă se alocă memorie în intervalul &amp;lt;code&amp;gt;803,862&amp;lt;/code&amp;gt; (60 byes).&lt;br /&gt;
* Pentru a șasea variabilă se alocă spațiul de memorie cuprins între &amp;lt;code&amp;gt;903,1002&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; bytes).&lt;br /&gt;
* Pentru ultima variabilă se alocă spațiul de memorie de &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; bytes, cuprins între &amp;lt;code&amp;gt;1051,1150&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def calculate_memory_allocation(M, N, occupied_intervals, R, variable_sizes):&lt;br /&gt;
    # Sort occupied intervals by starting address&lt;br /&gt;
    occupied_intervals.sort()&lt;br /&gt;
&lt;br /&gt;
    # Calculate total available memory&lt;br /&gt;
    total_available = 0&lt;br /&gt;
    free_intervals = []&lt;br /&gt;
&lt;br /&gt;
    # Find free intervals&lt;br /&gt;
    if occupied_intervals[0][0] &amp;gt; 0:&lt;br /&gt;
        free_intervals.append((0, occupied_intervals[0][0] - 1))&lt;br /&gt;
&lt;br /&gt;
    for i in range(N - 1):&lt;br /&gt;
        if occupied_intervals[i][1] + 1 &amp;lt; occupied_intervals[i + 1][0]:&lt;br /&gt;
            free_intervals.append((occupied_intervals[i][1] + 1, occupied_intervals[i + 1][0] - 1))&lt;br /&gt;
&lt;br /&gt;
    if occupied_intervals[-1][1] &amp;lt; M - 1:&lt;br /&gt;
        free_intervals.append((occupied_intervals[-1][1] + 1, M - 1))&lt;br /&gt;
&lt;br /&gt;
    for interval in free_intervals:&lt;br /&gt;
        total_available += interval[1] - interval[0] + 1&lt;br /&gt;
&lt;br /&gt;
    # Allocate memory for variables&lt;br /&gt;
    addresses = []&lt;br /&gt;
    current_var_index = 0&lt;br /&gt;
&lt;br /&gt;
    for interval in free_intervals:&lt;br /&gt;
        start = interval[0]&lt;br /&gt;
        end = interval[1]&lt;br /&gt;
&lt;br /&gt;
        while start &amp;lt;= end and current_var_index &amp;lt; R:&lt;br /&gt;
            var_size = variable_sizes[current_var_index]&lt;br /&gt;
&lt;br /&gt;
            if start + var_size - 1 &amp;lt;= end:&lt;br /&gt;
                addresses.append((current_var_index, start))&lt;br /&gt;
                start += var_size&lt;br /&gt;
                current_var_index += 1&lt;br /&gt;
            else:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
    # If we allocated all variables&lt;br /&gt;
    if current_var_index == R:&lt;br /&gt;
        return total_available, addresses&lt;br /&gt;
&lt;br /&gt;
    # If not all variables could be allocated&lt;br /&gt;
    max_address = addresses[-1][1] + variable_sizes[addresses[-1][0]] - 1 if addresses else -1&lt;br /&gt;
    return total_available, len(addresses), max_address&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare:&lt;br /&gt;
M = 1000  # Dimensiunea memoriei&lt;br /&gt;
N = 3  # Numărul de zone ocupate&lt;br /&gt;
occupied_intervals = [(100, 199), (300, 399), (500, 599)]  # Intervalele ocupate&lt;br /&gt;
R = 5  # Numărul de variabile declarate&lt;br /&gt;
variable_sizes = [50, 150, 60, 80, 200]  # Dimensiunea fiecărei variabile&lt;br /&gt;
&lt;br /&gt;
result = calculate_memory_allocation(M, N, occupied_intervals, R, variable_sizes)&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1642_-_Culegere&amp;diff=10179</id>
		<title>1642 - Culegere</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1642_-_Culegere&amp;diff=10179"/>
		<updated>2024-07-25T12:40:44Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pădurea magică din Povestea lui Negrimon este situată pe un teren dreptunghiular care poate fi privit ca o matrice cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; coloane, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Putem spune că terenul este împărţit în &amp;lt;code&amp;gt;N * M&amp;lt;/code&amp;gt;  parcele pătrate de latură &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. În pădure trăieşte şarpele Snake care, iniţial, este lung cât &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; parcele şi lat...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pădurea magică din Povestea lui Negrimon este situată pe un teren dreptunghiular care poate fi privit ca o matrice cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; coloane, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Putem spune că terenul este împărţit în &amp;lt;code&amp;gt;N * M&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parcele pătrate de latură &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. În pădure trăieşte şarpele Snake care, iniţial, este lung cât &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; parcele şi lat cât una singură. La începutul poveştii şarpele se află pe prima linie, pe parcelele de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, capul fiind pe poziţia &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; şi orientat spre est.&lt;br /&gt;
&lt;br /&gt;
Snake se deplasează cu o parcelă pe secundă. Astfel, după prima secundă, şarpele se va afla tot pe linia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, deplasat cu o poziţie spre dreapta, mai exact capul va fi în parcela &amp;lt;code&amp;gt;K + 1&amp;lt;/code&amp;gt;. Deplasarea se face simultan cu întreg corpul.&lt;br /&gt;
&lt;br /&gt;
În pădure au loc &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; evenimente ce pot fi de tipurile următoare:&lt;br /&gt;
&lt;br /&gt;
# Apariţia unui măr la secunda &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pe linia &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, care va dispărea la secunda &amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt;, dacă nu este mâncat până atunci de şarpe. Snake înghite mărul când capul său ajunge în parcela care îl conţine. Mărul dispare, desigur, iar corpul şarpelui creşte instantaneu cu o unitate care îi va fi adăugată la coadă şi va ocupa aceeaşi parcelă pe care s-a aflat coada (ultima porţiune din corp) la secunda anterioară înghiţirii mărului.&lt;br /&gt;
&lt;br /&gt;
# Apariţia unui schimbător la secunda &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pe linia &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, care va dispărea la secunda &amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt; şi care are valoarea &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;. Când capul şarpelui ajunge în parcela schimbătorului, direcţia ulterioară de deplasare va fi dată de valoarea &amp;lt;code&amp;gt;v ∈ {1, 2, 3, 4}&amp;lt;/code&amp;gt; cu semnificaţia: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; Nord (sus); &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; Est (dreapta); &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; Sud (jos); &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; Vest (stânga).&lt;br /&gt;
&lt;br /&gt;
Schimbătorul funcţionează astfel: de exemplu, dacă Snake se deplasează spre Est şi la o anumită secundă capul acestuia ajunge într-o parcelă unde se află un schimbător cu valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, la următoarea secundă capul se va afla în parcela situată deasupra schimbătorului şi în parcela schimbătorului se află prima porţiune din corpul şarpelui.&lt;br /&gt;
&lt;br /&gt;
Schimbătorul dispare exact în secunda &amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt; iar până atunci rămâne în matrice indiferent de câte ori Snake trece prin parcela acestuia. Schimbătorul va acţiona doar când capul lui Snake ajunge în parcela lui şi nu va exista nicio situaţie în care să se schimbe direcţia în sens opus celei din care vine. De exemplu, dacă direcţia lui Snake este spre Est, nu va întâlni un schimbător cu valoarea &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, care l-ar întoarce spre Vest.&lt;br /&gt;
&lt;br /&gt;
În fiecare secundă &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;, evenimentele se petrec în acestă ordine: dispar obiectele programate să dispară în secunda &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;, apar obiectele ce trebuie să apară în secunda &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;, Snake se deplasează cu o parcelă. Dacă printr-o combinaţie nefericită de mişcări, Snake se loveşte de propriul corp, el se blochează şi aşteptă serviciul de asistenţă a pădurii.&lt;br /&gt;
&lt;br /&gt;
Deoarece Snake se află într-o pădure magică, deplasarea lui respectă reguli speciale: când capul este pe ultima coloană din matrice şi se mişcă spre Est, el reapare pe aceeaşi linie, dar pe prima coloană, trăgând corpul simultan. Analog şi pentru prima coloană, când se deplasează spre Vest, capul reapare pe aceeaşi linie dar pe ultima coloană. Dacă şarpele se află pe prima linie şi se deplasează spre Nord, mişcarea va continua pe ultima linie şi aceeaşi coloană din matrice. Analog pentru ultima linie, când Snake se deplasează spre Sud, capul reapare pe prima linie şi aceeaşi&lt;br /&gt;
&lt;br /&gt;
coloană. Aceste mişcări au loc doar dacă Snake nu se blochează în propriul corp.&lt;br /&gt;
&lt;br /&gt;
Povestea se termină în secunda în care apare oricare dintre situaţiile: Snake se loveşte de propriul corp, caz în care el rămâne BLOCAT; toate cele &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; evenimente s-au produs şi nu mai există niciun obiect în matrice pentru că toate au&lt;br /&gt;
&lt;br /&gt;
dispărut, caz în care rămâne un şarpe LIBER.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
În funcţie de finalul poveştii, afişaţi starea lui Snake şi harta pădurii în secunda respectivă. Pe hartă trebuie să fie marcate parcelele ocupate de corpul lui Snake, inclusiv capul.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;culegere.in&amp;lt;/code&amp;gt; conține pe prima linie valorile: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; – numărul de linii, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; – numărul de coloane în care este împărţită pădurea, K- lungimea şarpelui şi &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; – numărul de evenimente din pădure, separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
Următoarele &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; linii respectă unul dintre formatele:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 x y st en&amp;lt;/code&amp;gt; – Apare un măr la secunda &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;, pe linia &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, coloana &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; şi dispare la secunda &amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 x y st en v&amp;lt;/code&amp;gt; – Apare un schimbător la secunda &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;, pe linia &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, coloana &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, dispare la secunda &amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt; şi are valoarea &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;. Evenimentele sunt sortate crescător în funcţie de &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;culegere.out&amp;lt;/code&amp;gt; va conține pe prima linie cuvântul &amp;lt;code&amp;gt;BLOCAT&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;LIBER&amp;lt;/code&amp;gt;, în funcţie de starea lui Snake la sfârşitul poveştii. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, se vor afla &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; caractere din mulţimea &amp;lt;code&amp;gt;{&#039;.&#039;, &#039;O&#039;, &#039;#&#039;}&amp;lt;/code&amp;gt;, cu&lt;br /&gt;
&lt;br /&gt;
următoarea semnificaţie : &amp;lt;code&amp;gt;&#039;.&#039;&amp;lt;/code&amp;gt; – parcelă liberă, majuscula &amp;lt;code&amp;gt;&#039;O&#039;&amp;lt;/code&amp;gt; – parcelă în care se află o porţiune din corpul şarpelui, &amp;lt;code&amp;gt;&#039;#&#039;&amp;lt;/code&amp;gt; – parcela în care se află capul lui Snake. Caracterul &amp;lt;code&amp;gt;&#039;#&#039;&amp;lt;/code&amp;gt; va apărea o singură dată în matrice.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N, M ≤ 2000; 2 ≤ K &amp;lt; M; 1 ≤ E ≤ 500.000;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ x ≤ N; 1 ≤ y ≤ M; 1 ≤ st &amp;lt; en ≤ 500.000; v ∈ {1,2,3,4}&amp;lt;/code&amp;gt;&lt;br /&gt;
* Obiectele apar doar în parcele libere.&lt;br /&gt;
* Povestea începe la secunda &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;culegere.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 5 3 4&lt;br /&gt;
 1 1 5 1 5&lt;br /&gt;
 2 1 1 2 6 3&lt;br /&gt;
 2 2 1 2 5 2&lt;br /&gt;
 2 4 4 3 5 4&lt;br /&gt;
&amp;lt;code&amp;gt;culegere.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 LIBER&lt;br /&gt;
 O....&lt;br /&gt;
 OO#..&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&#039;&#039;&#039;Secunda 0:&#039;&#039;&#039;&lt;br /&gt;
 OO#..&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
&#039;&#039;&#039;Secunda 1:&#039;&#039;&#039; apare 1 măr, deplasare spre Est&lt;br /&gt;
 .OO#M&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
&#039;&#039;&#039;Secunda 2:&#039;&#039;&#039; apar &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; schimbătoare, deplasare spre Est, înghite măr, creşte coada&lt;br /&gt;
 3OOO#&lt;br /&gt;
 2....&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
&#039;&#039;&#039;Secunda 3:&#039;&#039;&#039; apare un schimbător pe &amp;lt;code&amp;gt;(4, 4)&amp;lt;/code&amp;gt;, deplasare spre Est şi capul apare pe prima coloană peste schimbătorul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; din poziţia &amp;lt;code&amp;gt;(1, 1)&amp;lt;/code&amp;gt;&lt;br /&gt;
 #.OOO&lt;br /&gt;
 2....&lt;br /&gt;
 .....&lt;br /&gt;
 ....4&lt;br /&gt;
&#039;&#039;&#039;Secunda 4:&#039;&#039;&#039; Nu apar şi nu dispar obiecte, deplasare spre Sud, corpul urmează acelaşi traseu ca şi capul care a fost influenţat la secunda &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; de schimbătorul cu valoarea &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;; capul ajunge peste schimbătorul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; de la poziţia &amp;lt;code&amp;gt;(2,1)&amp;lt;/code&amp;gt;&lt;br /&gt;
 O..OO&lt;br /&gt;
 #....&lt;br /&gt;
 .....&lt;br /&gt;
 ....4&lt;br /&gt;
&#039;&#039;&#039;Secunda 5:&#039;&#039;&#039; dispare schimbătorul de la &amp;lt;code&amp;gt;(4, 4)&amp;lt;/code&amp;gt;, deplasare spre Est deoarece capul a fost influenţat de schimbătorul cu valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; la secunda &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;; dacă mărul nu ar fi fost mâncat, acum ar fi dispărut&lt;br /&gt;
 O...O&lt;br /&gt;
 O#...&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
&#039;&#039;&#039;Secunda 6:&#039;&#039;&#039; dispare primul schimbător chiar dacă acesta a fost acoperit de corpul lui&lt;br /&gt;
&lt;br /&gt;
Snake, deplasare spre Est&lt;br /&gt;
 O....&lt;br /&gt;
 OO#..&lt;br /&gt;
 .....&lt;br /&gt;
 .....&lt;br /&gt;
Aceasta este configuraţia finală deoarece acum a dispărut şi ultimul obiect. Snake nu s-a blocat în propriul corp, deci este LIBER.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
# Citire date de intrare&lt;br /&gt;
N, M = map(int, input().split())&lt;br /&gt;
K = int(input())&lt;br /&gt;
E = int(input())&lt;br /&gt;
&lt;br /&gt;
events = []&lt;br /&gt;
for _ in range(E):&lt;br /&gt;
    st, x, y, t, en = input().split()&lt;br /&gt;
    st, x, y, en = int(st), int(x), int(y), int(en)&lt;br /&gt;
    if t.isdigit():&lt;br /&gt;
        t = int(t)&lt;br /&gt;
    events.append((st, x-1, y-1, t, en))&lt;br /&gt;
&lt;br /&gt;
# Direcții: Nord (1), Est (2), Sud (3), Vest (4)&lt;br /&gt;
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # E, S, W, N&lt;br /&gt;
&lt;br /&gt;
# Inițializare șarpe&lt;br /&gt;
snake = deque([(0, i) for i in range(K)])&lt;br /&gt;
head = (0, K-1)&lt;br /&gt;
direction = 0  # Inițial est (E)&lt;br /&gt;
occupied = set(snake)&lt;br /&gt;
&lt;br /&gt;
# Evenimente active&lt;br /&gt;
active_apples = {}&lt;br /&gt;
active_switchers = {}&lt;br /&gt;
&lt;br /&gt;
# Stare șarpe&lt;br /&gt;
snake_alive = True&lt;br /&gt;
time = 0&lt;br /&gt;
&lt;br /&gt;
def move_snake():&lt;br /&gt;
    global head, direction&lt;br /&gt;
    new_head = ((head[0] + directions[direction][0]) % N, (head[1] + directions[direction][1]) % M)&lt;br /&gt;
    if new_head in occupied:&lt;br /&gt;
        return False&lt;br /&gt;
    occupied.add(new_head)&lt;br /&gt;
    snake.append(new_head)&lt;br /&gt;
    if new_head in active_apples:&lt;br /&gt;
        occupied.add(snake[-1])&lt;br /&gt;
        active_apples.pop(new_head)&lt;br /&gt;
    else:&lt;br /&gt;
        tail = snake.popleft()&lt;br /&gt;
        occupied.remove(tail)&lt;br /&gt;
    head = new_head&lt;br /&gt;
    if new_head in active_switchers:&lt;br /&gt;
        direction = active_switchers[new_head]&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Simulare&lt;br /&gt;
while snake_alive and events:&lt;br /&gt;
    # Elimina evenimentele care expira la timpul actual&lt;br /&gt;
    for pos in list(active_apples.keys()):&lt;br /&gt;
        if active_apples[pos] == time:&lt;br /&gt;
            active_apples.pop(pos)&lt;br /&gt;
    for pos in list(active_switchers.keys()):&lt;br /&gt;
        if active_switchers[pos][1] == time:&lt;br /&gt;
            active_switchers.pop(pos)&lt;br /&gt;
&lt;br /&gt;
    # Adaugă evenimente noi&lt;br /&gt;
    while events and events[0][0] == time:&lt;br /&gt;
        st, x, y, t, en = events.pop(0)&lt;br /&gt;
        if isinstance(t, int):&lt;br /&gt;
            active_switchers[(x, y)] = (t-1, en)&lt;br /&gt;
        else:&lt;br /&gt;
            active_apples[(x, y)] = en&lt;br /&gt;
&lt;br /&gt;
    # Deplasare șarpe&lt;br /&gt;
    snake_alive = move_snake()&lt;br /&gt;
    time += 1&lt;br /&gt;
&lt;br /&gt;
# Rezultate&lt;br /&gt;
if snake_alive:&lt;br /&gt;
    print(&amp;quot;LIBER&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    print(&amp;quot;BLOCAT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Harta finală&lt;br /&gt;
forest = [[&#039;.&#039; for _ in range(M)] for _ in range(N)]&lt;br /&gt;
for x, y in snake:&lt;br /&gt;
    forest[x][y] = &#039;S&#039;&lt;br /&gt;
forest[head[0]][head[1]] = &#039;H&#039;&lt;br /&gt;
&lt;br /&gt;
for line in forest:&lt;br /&gt;
    print(&#039;&#039;.join(line))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0750_-_S_Min&amp;diff=10178</id>
		<title>0750 - S Min</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0750_-_S_Min&amp;diff=10178"/>
		<updated>2024-07-25T12:38:29Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Ana are un joc nou. Pe o tablă pătrată este trasat un grid format din celule pătratice de dimensiune &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. În oricare dintre colţurile oricărei celule, Ana poate înfige câte un beţişor perpendicular pe tablă. După ce a plasat &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; beţişoare, Ana ia dintr-o cutie (cu un număr suficient de mare de corzi elastice circulare) câte o coardă cu care înconjoară trei sau mai multe beţişoare. Fiecare coardă este bine întinsă şi formează pe...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ana are un joc nou. Pe o tablă pătrată este trasat un grid format din celule pătratice de dimensiune &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. În oricare dintre colţurile oricărei celule, Ana poate înfige câte un beţişor perpendicular pe tablă. După ce a plasat &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; beţişoare, Ana ia dintr-o cutie (cu un număr suficient de mare de corzi elastice circulare) câte o coardă cu care înconjoară trei sau mai multe beţişoare. Fiecare coardă este bine întinsă şi formează pe tablă un contur poligonal. &lt;br /&gt;
&lt;br /&gt;
În figura alăturată este folosită o coardă ce formează un contur poligonal cu &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; laturi cu care sunt înconjurate &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; dintre cele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; beţişoare de pe tablă.&lt;br /&gt;
&lt;br /&gt;
Jocul se încheie când au fost plasate atâtea coarde încât toate beţişoarele de pe tablă să se afle pe marginea sau în interiorul a cel puţin unul dintre contururile poligonale formate. Scopul jocului este ca amplasarea corzilor să fie făcută convenabil astfel încât totalul ariilor contururilor poligonale formate să fie minim.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând coordonatele celor &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; beţişoare &amp;lt;code&amp;gt;(x[1], y[1])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x[2], y[2])&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;(x[n], y[n])&amp;lt;/code&amp;gt; măsurate faţă de unul dintre colţurile gridului, Ana doreşte să găsească suma minimă a ariilor poligonale obţinute prin amplasarea convenabilă a coardelor, astfel încât fiecare beţişor să se găsească în interiorul sau pe conturul a cel puţin un astfel de poligon.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;smin.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii, se află câte două numere naturale: &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;smin.out&amp;lt;/code&amp;gt; va conține pe prima linie numărul real &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;, reprezentând suma minimă a ariilor poligoanelor convexe care acoperă toate punctele date.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ n ≤ 17&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ x, y ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Datele de intrare nu vor conţine trei beţişoare plasate în puncte coliniare din planul tablei.&lt;br /&gt;
* Suma cerută se obţine însumând ariile tuturor poligoanelor, indiferent dacă unele poligoane se suprapun sau nu.&lt;br /&gt;
* Modulul diferenţei dintre valoarea reală a lui &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; şi cea afişată este mai mic decât &amp;lt;code&amp;gt;0.001&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;smin.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 0 2&lt;br /&gt;
 0 4&lt;br /&gt;
 4 4&lt;br /&gt;
 4 2&lt;br /&gt;
&amp;lt;code&amp;gt;smin.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 8.000&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Aria minimă  este dreptunghiul din prima figură, cu cele patru beţişoare în vârfuri. Se foloseşte o singură coardă elastică.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def orientation(p, q, r):&lt;br /&gt;
    val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1])&lt;br /&gt;
    if val == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    elif val &amp;gt; 0:&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return 2&lt;br /&gt;
&lt;br /&gt;
def convex_hull(points):&lt;br /&gt;
    n = len(points)&lt;br /&gt;
    if n &amp;lt; 3:&lt;br /&gt;
        return points&lt;br /&gt;
&lt;br /&gt;
    l = min(range(n), key=lambda i: (points[i][0], points[i][1]))&lt;br /&gt;
    hull = []&lt;br /&gt;
&lt;br /&gt;
    p = l&lt;br /&gt;
    while True:&lt;br /&gt;
        hull.append(points[p])&lt;br /&gt;
        q = (p + 1) % n&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if orientation(points[p], points[i], points[q]) == 2:&lt;br /&gt;
                q = i&lt;br /&gt;
        p = q&lt;br /&gt;
        if p == l:&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
    return hull&lt;br /&gt;
&lt;br /&gt;
def polygon_area(points):&lt;br /&gt;
    n = len(points)&lt;br /&gt;
    area = 0.0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        j = (i + 1) % n&lt;br /&gt;
        area += points[i][0] * points[j][1]&lt;br /&gt;
        area -= points[j][0] * points[i][1]&lt;br /&gt;
    return abs(area) / 2.0&lt;br /&gt;
&lt;br /&gt;
def remaining_points(points, hull):&lt;br /&gt;
    hull_set = set(hull)&lt;br /&gt;
    return [p for p in points if p not in hull_set]&lt;br /&gt;
&lt;br /&gt;
def minimum_total_area(points):&lt;br /&gt;
    total_area = 0.0&lt;br /&gt;
    while points:&lt;br /&gt;
        hull = convex_hull(points)&lt;br /&gt;
        total_area += polygon_area(hull)&lt;br /&gt;
        points = remaining_points(points, hull)&lt;br /&gt;
    return total_area&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
n = int(input(&amp;quot;Introduceți numărul de bețișoare: &amp;quot;))&lt;br /&gt;
points = []&lt;br /&gt;
&lt;br /&gt;
for _ in range(n):&lt;br /&gt;
    x, y = map(int, input().split())&lt;br /&gt;
    points.append((x, y))&lt;br /&gt;
&lt;br /&gt;
# Calcularea ariei minime totale&lt;br /&gt;
result = minimum_total_area(points)&lt;br /&gt;
print(f&amp;quot;Suma minimă a ariilor contururilor poligonale este: {result}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0749_-_Cerc_2&amp;diff=10177</id>
		<title>0749 - Cerc 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0749_-_Cerc_2&amp;diff=10177"/>
		<updated>2024-07-25T12:35:47Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; sunt aşezate pe cerc, în sensul acelor de ceasornic, în ordine strict crescătoare.  Există &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; segmente de dreaptă diferite care unesc &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; perechi de puncte dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; date. Cele două puncte care formează orice pereche sunt distincte.  Distanţele dintre două puncte succesive sunt alese astfel încât să nu existe &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; sau mai multe segmente care t...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; sunt aşezate pe cerc, în sensul acelor de ceasornic, în ordine strict crescătoare.&lt;br /&gt;
&lt;br /&gt;
Există &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; segmente de dreaptă diferite care unesc &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; perechi de puncte dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; date. Cele două puncte care formează orice pereche sunt distincte.&lt;br /&gt;
&lt;br /&gt;
Distanţele dintre două puncte succesive sunt alese astfel încât să nu existe &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; sau mai multe segmente care trec printr-un acelaşi punct interior cercului.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscându-se numărul de puncte, numărul de perechi şi perechile de puncte care vor fi unite, se cere să se determine numărul &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; de puncte de intersecţie formate de acestea în interiorul cercului (punctele de intersecţie aflate chiar pe cerc nefiind luate în considerare).&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;cerc2.in&amp;lt;/code&amp;gt; conţine:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie două numere &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; despărţite printr-un spaţiu, numere reprezentând numărul de puncte şi respectiv numărul de segmente;&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii, câte o pereche de numere distincte &amp;lt;code&amp;gt;p1[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;p2[i]&amp;lt;/code&amp;gt; despărţite prin câte un spaţiu, numere reprezentând capetele câte unui segment.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;cerc2.out&amp;lt;/code&amp;gt; va conține un singur număr &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; reprezentând numărul total de puncte de intersecţie formate în interiorul cercului. Dacă acest număr depăşeşte &amp;lt;code&amp;gt;999999&amp;lt;/code&amp;gt;, atunci se va scrie numărul format numai din ultimele sale &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; cifre.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 5000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ M &amp;lt; 125000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p1[i] &amp;lt; p2[i] ≤ N&amp;lt;/code&amp;gt;, numere naturale, oricare &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; din &amp;lt;code&amp;gt;{1,…, M}&amp;lt;/code&amp;gt;&lt;br /&gt;
* NU există perechi &amp;lt;code&amp;gt;p1[i] p2[i]&amp;lt;/code&amp;gt; identice.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;cerc2.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 6&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 2 4&lt;br /&gt;
 3 5&lt;br /&gt;
 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;cerc2.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
S-au format în interiorul cercului &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; puncte de intersecţie (marcate prin cerculeţe pe figura de mai jos).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def count_intersections(n, m, pairs):&lt;br /&gt;
    def intersects(a, b, c, d):&lt;br /&gt;
        return (a &amp;lt; c &amp;lt; b &amp;lt; d) or (c &amp;lt; a &amp;lt; d &amp;lt; b)&lt;br /&gt;
    &lt;br /&gt;
    intersections = 0&lt;br /&gt;
    &lt;br /&gt;
    # Iterate over all pairs of segments&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        for j in range(i + 1, m):&lt;br /&gt;
            a, b = pairs[i]&lt;br /&gt;
            c, d = pairs[j]&lt;br /&gt;
            # Ensure that for each segment (x, y), we have x &amp;lt; y&lt;br /&gt;
            if a &amp;gt; b:&lt;br /&gt;
                a, b = b, a&lt;br /&gt;
            if c &amp;gt; d:&lt;br /&gt;
                c, d = d, c&lt;br /&gt;
            if intersects(a, b, c, d):&lt;br /&gt;
                intersections += 1&lt;br /&gt;
    &lt;br /&gt;
    return intersections&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
n = int(input(&amp;quot;Introduceti numarul de puncte (N): &amp;quot;))&lt;br /&gt;
m = int(input(&amp;quot;Introduceti numarul de perechi (M): &amp;quot;))&lt;br /&gt;
pairs = []&lt;br /&gt;
&lt;br /&gt;
for _ in range(m):&lt;br /&gt;
    x, y = map(int, input().split())&lt;br /&gt;
    pairs.append((x, y))&lt;br /&gt;
&lt;br /&gt;
# Calcularea numarului de puncte de intersectie&lt;br /&gt;
result = count_intersections(n, m, pairs)&lt;br /&gt;
print(f&amp;quot;Numarul de puncte de intersectie este: {result}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1040_-_Clepsidru&amp;diff=10176</id>
		<title>1040 - Clepsidru</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1040_-_Clepsidru&amp;diff=10176"/>
		<updated>2024-07-25T12:33:50Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: O &amp;#039;&amp;#039;&amp;#039;clepsidră&amp;#039;&amp;#039;&amp;#039; este un dispozitiv folosit pentru a măsura timpul. Clepsidra este alcătuită din două incinte de sticlă, conectate printr-un tub fin. Una dintre incinte este umplută cu nisip, acesta scurgându-se în cea de-a doua incintă, cu o viteză constantă. Clepsidra poate fi întoarsă, pentru a măsura o altă perioadă de timp.  Arheologii au descoperit un dispozitiv, pe care l-au denumit &amp;#039;&amp;#039;&amp;#039;clepsidru&amp;#039;&amp;#039;&amp;#039;, format din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; clepsidre identice, suprap...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O &#039;&#039;&#039;clepsidră&#039;&#039;&#039; este un dispozitiv folosit pentru a măsura timpul. Clepsidra este alcătuită din două incinte de sticlă, conectate printr-un tub fin. Una dintre incinte este umplută cu nisip, acesta scurgându-se în cea de-a doua incintă, cu o viteză constantă. Clepsidra poate fi întoarsă, pentru a măsura o altă perioadă de timp.&lt;br /&gt;
&lt;br /&gt;
Arheologii au descoperit un dispozitiv, pe care l-au denumit &#039;&#039;&#039;clepsidru&#039;&#039;&#039;, format din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; clepsidre identice, suprapuse, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, prin care nisipul poate circula de la o clepsidră la alta datorită forţei gravitaţionale.&lt;br /&gt;
&lt;br /&gt;
Studiind acest obiect, arheologii au constatat că :&lt;br /&gt;
&lt;br /&gt;
* dispozitivul poate fi utilizat atât în poziţia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, când clepsidrele sunt în ordinea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ,…, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cu clepsidra &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; aşezată pe sol, cât şi în poziţia &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, când clepsidrele sunt în ordinea &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; cu clepsidra &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; aşezată pe sol;&lt;br /&gt;
* viteza de trecere a nisipului de la o incintă la alta, a aceleiaşi clepsidre, este de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; bob de nisip/secundă, pentru toate clepsidrele, indiferent de poziţie;&lt;br /&gt;
* trecerea clepsidrului dintr-o poziţie în alta presupune răsturnarea acestuia şi reaşezarea boabelor de nisip;&lt;br /&gt;
* timpul de trecere a boabelor de nisip de la o clepsidră la alta este 0.&lt;br /&gt;
&lt;br /&gt;
Arheologii studiază comportarea clepsidrului realizând două experimente diferite, după cum urmează:&lt;br /&gt;
&lt;br /&gt;
a) Se aşează clepsidrul în poziţia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, se introduc în incinta de sus a clepsidrei &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; un număr &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; de boabe de nisip şi se determină după câte secunde vor ajunge toate boabele de nisip în incinta de jos a ultimei clepsidre;&lt;br /&gt;
&lt;br /&gt;
b) Se aşează clepsidrul în poziţia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, se introduc în incinta de sus a clepsidrei &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; un număr &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; de boabe de nisip, apoi se aşează clepsidrul în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; stări consecutive, o stare fiind caracterizată de valorile &amp;lt;code&amp;gt;s&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;, ce reprezintă numărul de secunde, respectiv poziţia, în care este menţinut nemişcat clepsidrul, iar la final se determină numărul de boabe de nisip din incintele fiecărei clepsidre.&lt;br /&gt;
&lt;br /&gt;
Spre exemplu, dacă clepsidrul este format din &amp;lt;code&amp;gt;n=2&amp;lt;/code&amp;gt; clepsidre, iar în incinta de sus a primei clepsidre se introduc &amp;lt;code&amp;gt;b=3&amp;lt;/code&amp;gt; boabe de nisip, la primul experiment se va obţine valoarea &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La al doilea experiment se aşează clepsidrul în &amp;lt;code&amp;gt;k=2&amp;lt;/code&amp;gt; stări, caracterizate prin  &amp;lt;code&amp;gt;s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;p&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=1&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;s&amp;lt;sub&amp;gt;2=1&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;sub&amp;gt;, &amp;lt;code&amp;gt;p2=2&amp;lt;/code&amp;gt;.&amp;lt;/sub&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Numărul de boabe de nisip din clepsidre va evolua ca în figura alăturată.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se scrie un program care citeşte valorile &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, precum şi valorile &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;s&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;, şi calculează valorile obţinute de arheologi la realizarea celor două experimente.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;clepsidru.in&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale nenule &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, separate printr-un singur spaţiu, cu semnificaţia din enunţ; a doua linie conţine numărul natural nenul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; având semnificaţia din enunţ, iar următoarele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii conţin fiecare câte o pereche de valori &amp;lt;code&amp;gt;s&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;, separate printr-un singur spaţiu, cu semnificaţia din enunţ.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;clepsidru.out&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural ce reprezintă valoarea obţinută la primul experiment, iar pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii va conţine câte o pereche de numere naturale, separate printr-un singur spaţiu, ce reprezintă cantităţile de boabe de nisip din incintele de sus şi de jos ale celor &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; clepsidre, scrise în ordinea de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; a clepsidrelor, după realizarea celui de-al doilea experiment.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 1 000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ b ≤ 1 000 000 000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 1 000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ si ≤ 1 000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt; aparține &amp;lt;code&amp;gt;{1, 2}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pentru rezolvarea corectă a primei cerinţe se acordă &amp;lt;code&amp;gt;25%&amp;lt;/code&amp;gt; din punctaj, iar pentru rezolvarea corectă a celei de-a doua cerinţe se acordă &amp;lt;code&amp;gt;75%&amp;lt;/code&amp;gt; din punctaj.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;clepsidru.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3&lt;br /&gt;
 2&lt;br /&gt;
 3 1&lt;br /&gt;
 1 2&lt;br /&gt;
&amp;lt;code&amp;gt;clepsidru.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 1 1&lt;br /&gt;
 0 1&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&lt;br /&gt;
* Clepsidrul este format din &amp;lt;code&amp;gt;n=2&amp;lt;/code&amp;gt; clepsidre şi în incinta de sus a primei clepsidre se introduc &amp;lt;code&amp;gt;b=3&amp;lt;/code&amp;gt; boabe de nisip.&lt;br /&gt;
* Toate boabele de nisip vor ajunge în incinta de jos a ultimei clepsidre după &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; secunde.&lt;br /&gt;
* După ce clepsidrul este aşezat &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; secunde în poziţia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; secundă în poziţia &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;,  în clepsidre se vor găsi câte &amp;lt;code&amp;gt;(1,1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(0,1)&amp;lt;/code&amp;gt; boabe de nisip&lt;br /&gt;
* &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def experiment1(n, b):&lt;br /&gt;
    return b + (n - 1)&lt;br /&gt;
&lt;br /&gt;
def experiment2(n, b, k, states):&lt;br /&gt;
    # Initializare&lt;br /&gt;
    clepsidre = [0] * n&lt;br /&gt;
    clepsidre[0] = b&lt;br /&gt;
    &lt;br /&gt;
    for si, pi in states:&lt;br /&gt;
        if pi == 1:  # poziția inițială&lt;br /&gt;
            for _ in range(si):&lt;br /&gt;
                for i in range(n-1, 0, -1):&lt;br /&gt;
                    transfer = min(clepsidre[i-1], 1)&lt;br /&gt;
                    clepsidre[i] += transfer&lt;br /&gt;
                    clepsidre[i-1] -= transfer&lt;br /&gt;
        elif pi == 2:  # poziția inversată&lt;br /&gt;
            for _ in range(si):&lt;br /&gt;
                for i in range(1, n):&lt;br /&gt;
                    transfer = min(clepsidre[i], 1)&lt;br /&gt;
                    clepsidre[i-1] += transfer&lt;br /&gt;
                    clepsidre[i] -= transfer&lt;br /&gt;
&lt;br /&gt;
    return clepsidre&lt;br /&gt;
&lt;br /&gt;
# Citirea input-ului&lt;br /&gt;
n = int(input(&amp;quot;Introduceti numarul de clepsidre: &amp;quot;))&lt;br /&gt;
b = int(input(&amp;quot;Introduceti numarul de boabe de nisip: &amp;quot;))&lt;br /&gt;
k = int(input(&amp;quot;Introduceti numarul de stari: &amp;quot;))&lt;br /&gt;
states = []&lt;br /&gt;
&lt;br /&gt;
for _ in range(k):&lt;br /&gt;
    si = int(input(&amp;quot;Introduceti numarul de secunde pentru starea curenta: &amp;quot;))&lt;br /&gt;
    pi = int(input(&amp;quot;Introduceti pozitia pentru starea curenta: &amp;quot;))&lt;br /&gt;
    states.append((si, pi))&lt;br /&gt;
&lt;br /&gt;
# Rezultatele experimentelor&lt;br /&gt;
timp_experiment1 = experiment1(n, b)&lt;br /&gt;
rezultat_experiment2 = experiment2(n, b, k, states)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Timpul pentru experimentul 1: {timp_experiment1}&amp;quot;)&lt;br /&gt;
print(&amp;quot;Numarul de boabe de nisip in fiecare clepsidra dupa experimentul 2:&amp;quot;)&lt;br /&gt;
for i, boabe in enumerate(rezultat_experiment2, 1):&lt;br /&gt;
    print(f&amp;quot;Clepsidra {i}: {boabe} boabe&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2176_-_Ruleta&amp;diff=10175</id>
		<title>2176 - Ruleta</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2176_-_Ruleta&amp;diff=10175"/>
		<updated>2024-07-25T12:30:49Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Nicuşor este elev în clasa &amp;lt;code&amp;gt;a VI-a&amp;lt;/code&amp;gt; şi s-a gândit că este suficient de mare ca să inventeze un joc nou. Are doar o foaie de hârtie şi un pix. Scrie mai întâi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale în cerc. Acestea formează Ruleta numerelor. Jocul se desfăşoară după următoarele reguli:  -	se parcurge şirul numerelor în sensul deplasării acelor de ceasornic;  -	se porneşte de fiecare dată de la acelaşi element;    -	se execută de fiecare dată o rota...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nicuşor este elev în clasa &amp;lt;code&amp;gt;a VI-a&amp;lt;/code&amp;gt; şi s-a gândit că este suficient de mare ca să inventeze un joc nou. Are doar o foaie de hârtie şi un pix. Scrie mai întâi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale în cerc. Acestea formează Ruleta numerelor. Jocul se desfăşoară după următoarele reguli:&lt;br /&gt;
&lt;br /&gt;
-	se parcurge şirul numerelor în sensul deplasării acelor de ceasornic;&lt;br /&gt;
&lt;br /&gt;
-	se porneşte de fiecare dată de la acelaşi element;  &lt;br /&gt;
&lt;br /&gt;
-	se execută de fiecare dată o rotaţie completă;&lt;br /&gt;
&lt;br /&gt;
-	fiecare element nenul se scade din elementul imediat următor doar dacă este mai mic sau egal cu acesta şi nenul;&lt;br /&gt;
&lt;br /&gt;
Exemplu. Dacă notăm cu &amp;lt;code&amp;gt;R1, R2, R3, R4, R5, R6, R7, R8&amp;lt;/code&amp;gt; şirul numerelor ce formează ruleta din &amp;lt;code&amp;gt;figura 1&amp;lt;/code&amp;gt;, atunci, o rotaţie completă realizează următoarele modificări asupra numerelor din listă:&lt;br /&gt;
&lt;br /&gt;
-    ruleta se opreşte atunci când execută o rotaţie completă şi nu se modifică nici o valoare  din şirul elementelor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Exemplu&amp;lt;/code&amp;gt;. Pentru ruleta din &amp;lt;code&amp;gt;figura 1&amp;lt;/code&amp;gt; se execută &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; rotaţii (dintre care &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; în care se fac modificări):&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care să determine, pentru un şir de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale care indică starea iniţială a ruletei, numărul &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; de rotaţii complete efectuate respectând regulile jocului până la încheierea acestuia şi numărul &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; al elementelor nenule aflate în şir la încheierea jocului.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;ruleta.in&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de numere naturale aşezate în cerc iar pe linia a doua, separate prin câte un spaţiu, cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori , în ordinea deplasării, începând cu elementul de la care porneşte ruleta.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;ruleta.out&amp;lt;/code&amp;gt; conţine pe prima linie, separate printr-un spaţiu, valorile &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; (în această ordine).&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n ≤ 10000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* numerele de pe ruletă sunt numere naturale mai mici sau cel mult egale cu &amp;lt;code&amp;gt;30000&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;ruleta.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 1 2 3 4 3 2 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;ruleta.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def roulette_game(numbers):&lt;br /&gt;
    n = len(numbers)&lt;br /&gt;
    rotations = 0&lt;br /&gt;
    modified = True&lt;br /&gt;
&lt;br /&gt;
    while modified:&lt;br /&gt;
        modified = False&lt;br /&gt;
        rotations += 1&lt;br /&gt;
        new_numbers = numbers[:]&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if numbers[i] != 0 and numbers[i] &amp;lt;= numbers[(i + 1) % n]:&lt;br /&gt;
                new_numbers[(i + 1) % n] -= numbers[i]&lt;br /&gt;
                modified = True&lt;br /&gt;
        numbers = new_numbers&lt;br /&gt;
&lt;br /&gt;
    non_zero_count = sum(1 for x in numbers if x != 0)&lt;br /&gt;
    return rotations, non_zero_count&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
initial_numbers = [3, 4, 5, 6, 7, 8, 9, 10]&lt;br /&gt;
rotations, non_zero_count = roulette_game(initial_numbers)&lt;br /&gt;
print(f&amp;quot;Numărul de rotații: {rotations}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Numărul de elemente nenule rămase: {non_zero_count}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1224_-_Restaurare&amp;diff=10171</id>
		<title>1224 - Restaurare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1224_-_Restaurare&amp;diff=10171"/>
		<updated>2024-07-23T11:37:51Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: &amp;lt;code&amp;gt;restaurare.in&amp;lt;/code&amp;gt;  5  4 3 2 4 2  3  1 4 3 &amp;lt;code&amp;gt;restaurare.out&amp;lt;/code&amp;gt;  0  4  2 După descoperirea ruinelor unei cetăți medievale, arheologii au hotărât restaurarea acesteia, începând cu zidul principal. Acesta este format din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piloni, fiecare cu lățimea de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; metru, așezați unul lângă altul (lipiți). Se cunoaște înălțimea, în metri, a fiecărui pilon dar, din păcate, nu toți mai sunt acum la același nivel.  Pentru restau...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;restaurare.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 4 3 2 4 2&lt;br /&gt;
 3&lt;br /&gt;
 1 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;restaurare.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
 4&lt;br /&gt;
 2&lt;br /&gt;
După descoperirea ruinelor unei cetăți medievale, arheologii au hotărât restaurarea acesteia, începând cu zidul principal. Acesta este format din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piloni, fiecare cu lățimea de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; metru, așezați unul lângă altul (lipiți). Se cunoaște înălțimea, în metri, a fiecărui pilon dar, din păcate, nu toți mai sunt acum la același nivel.&lt;br /&gt;
&lt;br /&gt;
Pentru restaurarea zidului, arheologii dispun de cărămizi care au lățimea de câte &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; metru și lungimi variabile, exprimate în metri. Sunt disponibile oricâte cărămizi, de oricare lungime. Considerăm că toate cărămizile disponibile și toți pilonii care alcătuiesc zidul au aceeași grosime, de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; metru.&lt;br /&gt;
&lt;br /&gt;
Restaurarea constă în două etape:&lt;br /&gt;
&lt;br /&gt;
* în prima etapă, toți pilonii cu înălțimea mai mare sau egală cu &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; se retează, aducându-se astfel la înălțimea &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;, ceilalți, mai scunzi, păstrându-și înălțimea inițială;&lt;br /&gt;
* în a doua etapă se aduc toți pilonii la aceeași înălțime, umplându-se golurile dintre ei cu cărămizi, astfel încât  zidul să devină compact; din motive neînțelese, arheologii vor așeza cărămizile “culcate”, fiecare dintre acestea ocupând, eventual, spațiul aflat deasupra mai multor piloni.&lt;br /&gt;
&lt;br /&gt;
Arheologii au analizat situația, independent, pentru &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; valori posibile ale lui &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru fiecare dintre cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; valori alese pentru înălțimea &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;, se cere să se determine numărul minim de cărămizi necesare restaurării zidului, independent, pornind de la înălțimile inițiale ale pilonilor.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;restaurare.in&amp;lt;/code&amp;gt; conține:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie, numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de piloni;&lt;br /&gt;
* pe a doua linie, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale, separate prin câte un spațiu, reprezentând înălțimile inițiale ale pilonilor, în ordine, de la stânga la dreapta;&lt;br /&gt;
* pe linia a treia, numărul natural &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, reprezentând numărul de valori posibile pentru înălțimea &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pe a patra linie, &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; numere naturale, separate prin câte un spațiu, reprezentând valorile posibile ale lui &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;restaurare.out&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; numere, câte unul pe linie, reprezentând numărul minim de cărămizi necesare restaurării pentru fiecare dintre înălțimile &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;, în ordinea în care acestea apar în fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* înălțimea fiecărui pilon este un număr natural din intervalul &amp;lt;code&amp;gt;[1 , 100000]&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 100000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ H ≤&amp;lt;/code&amp;gt; valoarea maximă dintre înălțimile inițiale ale pilonilor;&lt;br /&gt;
* pentru 35% dintre teste &amp;lt;code&amp;gt;N ≤ 1000&amp;lt;/code&amp;gt;, iar pentru alte 40% dintre teste &amp;lt;code&amp;gt;Q = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;restaurare.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 4 3 2 4 2&lt;br /&gt;
 3&lt;br /&gt;
 1 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;restaurare.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
 4&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Forma inițială  a zidului este:&lt;br /&gt;
&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;H=1&amp;lt;/code&amp;gt; toți pilonii au aceeași înălțime, deci nu mai este necesară nicio cărămidă, pentru &amp;lt;code&amp;gt;H=4&amp;lt;/code&amp;gt;, sunt necesare &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cărămizi, zidul având, după restaurare structura din fig. a, iar pentru &amp;lt;code&amp;gt;H=3&amp;lt;/code&amp;gt;, sunt necesare &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; cărămizi, zidul având, după restaurare structura din fig. b.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def min_bricks_for_heights(piloni, H):&lt;br /&gt;
    total_bricks = 0&lt;br /&gt;
    current_height = 0&lt;br /&gt;
    &lt;br /&gt;
    for height in piloni:&lt;br /&gt;
        if height &amp;gt; H:&lt;br /&gt;
            height = H&lt;br /&gt;
        &lt;br /&gt;
        if height &amp;gt; current_height:&lt;br /&gt;
            total_bricks += 1&lt;br /&gt;
            current_height = height&lt;br /&gt;
        elif height &amp;lt; current_height:&lt;br /&gt;
            current_height = height&lt;br /&gt;
    &lt;br /&gt;
    return total_bricks&lt;br /&gt;
&lt;br /&gt;
def bricks_needed_for_restoration(piloni, H_values):&lt;br /&gt;
    results = []&lt;br /&gt;
    for H in H_values:&lt;br /&gt;
        results.append(min_bricks_for_heights(piloni, H))&lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
N = 5&lt;br /&gt;
piloni = [3, 1, 4, 1, 5]&lt;br /&gt;
Q = 3&lt;br /&gt;
H_values = [2, 3, 5]&lt;br /&gt;
&lt;br /&gt;
print(bricks_needed_for_restoration(piloni, H_values))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1208_-_Solitar&amp;diff=10170</id>
		<title>1208 - Solitar</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1208_-_Solitar&amp;diff=10170"/>
		<updated>2024-07-23T11:35:37Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Se consideră un joc de cărţi cu un număr nelimitat de coloane. Iniţial, pe prima coloană există, într‑o ordine oarecare, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; cărţi cu numere distincte din mulţimea &amp;lt;code&amp;gt;{1,2,…,N}&amp;lt;/code&amp;gt;, următoarele coloane fiind vide (fără cărţi). Numim secvenţă de la sfârşitul coloanei ultima sau ultimele două sau ultimele trei etc. cărţi din coloană care au scrise pe ele numere consecutive în ordine crescătoare, considerate de jos în sus. De exemp...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră un joc de cărţi cu un număr nelimitat de coloane. Iniţial, pe prima coloană există, într‑o ordine oarecare, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; cărţi cu numere distincte din mulţimea &amp;lt;code&amp;gt;{1,2,…,N}&amp;lt;/code&amp;gt;, următoarele coloane fiind vide (fără cărţi). Numim secvenţă de la sfârşitul coloanei ultima sau ultimele două sau ultimele trei etc. cărţi din coloană care au scrise pe ele numere consecutive în ordine crescătoare, considerate de jos în sus. De exemplu, în figurile 1 şi 2 sunt reprezentate două astfel de coloane cu câte &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; cărţi având numere între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. În figura 1, secvenţa de la sfârşitul coloanei este formată doar din cartea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. În figura 2, secvenţa de la sfârşitul coloanei este formată din cărţile &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. Se observă că în coloana din figura 1 mai există o secvenţă formată din cărţile &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, dar aceasta nu este la sfârşitul coloanei.&lt;br /&gt;
&lt;br /&gt;
Operaţiile permise ale jocului sunt:&lt;br /&gt;
&lt;br /&gt;
A. mutarea secvenţei de cărţi de la sfârşitul unei coloane pe o coloană nouă, dacă acea coloană este vidă (nu conţine nicio carte);&lt;br /&gt;
&lt;br /&gt;
B. mutarea secvenţei de cărţi de la sfârşitul unei coloane la sfârşitul altei coloane cu cărţi, doar dacă secvenţa mutată formează o secvenţă de numere consecutive cu cele de pe cartea sau cărţile aflate la sfârşitul coloanei respective.&lt;br /&gt;
&lt;br /&gt;
Se doreşte ca, printr-un număr minim de operaţii permise, să se obţină pe una dintre coloane toate numerele de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, în ordine crescătoare, considerate de jos în sus.&lt;br /&gt;
&lt;br /&gt;
De exemplu, de la configuraţia iniţială din figura 2 se va obţine, printr-o operaţie &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, configuraţia 1 de mai jos. Apoi, printr-o operaţie &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, se obţine configuraţia 2, printr-o nouă operaţie &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; se obţine configuraţia 3, apoi se mută secvenţa &amp;lt;code&amp;gt;2,3,4,5,6&amp;lt;/code&amp;gt; pe o coloană vidă (operaţia &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;), apoi se mută secvenţa &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; peste secvenţa &amp;lt;code&amp;gt;2,3,4,5,6&amp;lt;/code&amp;gt; (operaţia &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;) şi se obţine, pe coloana a doua, configuraţia finală cerută.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Configurația 1&lt;br /&gt;
|Configurația 2&lt;br /&gt;
|Configurația 3&lt;br /&gt;
|Configurația 4&lt;br /&gt;
|Configurația 5&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând valoarea lui &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, precum şi valorile cărţilor de pe prima coloană, să se determine numărul minim de operaţii prin care se poate obţine secvenţa &amp;lt;code&amp;gt;1, 2, …, N&amp;lt;/code&amp;gt; pe una dintre coloane.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul &amp;lt;code&amp;gt;solitar.in&amp;lt;/code&amp;gt; conţine pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi pe linia următoare &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale distincte din mulţimea &amp;lt;code&amp;gt;{1,2,…,N}&amp;lt;/code&amp;gt;, separate prin câte un spaţiu, date în ordinea de pe coloană, de sus în jos.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul &amp;lt;code&amp;gt;solitar.out&amp;lt;/code&amp;gt; va conţine o singură linie pe care va fi scris un număr natural &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; reprezentând numărul minim de operaţii prin care se poate obţine secvenţa cerută.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;solitar.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 1 6 2 5 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;solitar.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Cele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; mutări sunt descrise în enunţul problemei.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
def min_operations_to_sort_cards(N, cards):&lt;br /&gt;
    # Initialize columns with the initial column&lt;br /&gt;
    columns = [deque(cards)]&lt;br /&gt;
    &lt;br /&gt;
    def find_sequences(column):&lt;br /&gt;
        sequences = []&lt;br /&gt;
        start = len(column) - 1&lt;br /&gt;
        while start &amp;gt;= 0:&lt;br /&gt;
            end = start&lt;br /&gt;
            while start &amp;gt; 0 and column[start] - 1 == column[start - 1]:&lt;br /&gt;
                start -= 1&lt;br /&gt;
            sequences.append((start, end))&lt;br /&gt;
            start -= 1&lt;br /&gt;
        return sequences&lt;br /&gt;
    &lt;br /&gt;
    def move_sequence(src, dst):&lt;br /&gt;
        if not columns[dst] or columns[dst][-1] + 1 == columns[src][sequences[0][0]]:&lt;br /&gt;
            for _ in range(sequences[0][1] - sequences[0][0] + 1):&lt;br /&gt;
                columns[dst].append(columns[src].popleft())&lt;br /&gt;
        else:&lt;br /&gt;
            for _ in range(sequences[0][1] - sequences[0][0] + 1):&lt;br /&gt;
                columns.append(deque())&lt;br /&gt;
                columns[-1].append(columns[src].popleft())&lt;br /&gt;
    &lt;br /&gt;
    operations = 0&lt;br /&gt;
    while len(columns) &amp;gt; 1 or len(columns[0]) != N:&lt;br /&gt;
        for idx, col in enumerate(columns):&lt;br /&gt;
            sequences = find_sequences(col)&lt;br /&gt;
            if sequences[0][0] == 0:&lt;br /&gt;
                if idx == 0 and len(sequences) == 1 and sequences[0][1] == N - 1:&lt;br /&gt;
                    return operations&lt;br /&gt;
                continue&lt;br /&gt;
            move_sequence(idx, (idx + 1) % len(columns))&lt;br /&gt;
            operations += 1&lt;br /&gt;
    &lt;br /&gt;
    return operations&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
N = 6&lt;br /&gt;
cards = [5, 4, 3, 2, 1, 6]&lt;br /&gt;
print(&amp;quot;Numărul minim de operații:&amp;quot;, min_operations_to_sort_cards(N, cards))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1706_-_Stele&amp;diff=10169</id>
		<title>1706 - Stele</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1706_-_Stele&amp;diff=10169"/>
		<updated>2024-07-23T11:32:42Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Pasionată de astronomie, Teodora dorește să țină evidența numărului de stele din galaxii. Pentru a face lucrurile mai interesante, ea codifică aceste numere într-un sistem propriu, transformându-le într-o înșiruire de litere și cifre după algoritmul următor:  * notează fiecare putere a lui &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, strict mai mică decât &amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;26&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, cu o literă a alfabetului, astfel:  {| class=&amp;quot;wikitable&amp;quot; |&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; |&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pasionată de astronomie, Teodora dorește să țină evidența numărului de stele din galaxii. Pentru a face lucrurile mai interesante, ea codifică aceste numere într-un sistem propriu, transformându-le într-o înșiruire de litere și cifre după algoritmul următor:&lt;br /&gt;
&lt;br /&gt;
* notează fiecare putere a lui &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, strict mai mică decât &amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;26&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;, cu o literă a alfabetului, astfel:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;9&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;11&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|a&lt;br /&gt;
|b&lt;br /&gt;
|c&lt;br /&gt;
|d&lt;br /&gt;
|e&lt;br /&gt;
|f&lt;br /&gt;
|g&lt;br /&gt;
|h&lt;br /&gt;
|i&lt;br /&gt;
|j&lt;br /&gt;
|k&lt;br /&gt;
|l&lt;br /&gt;
|m&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;13&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;14&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;17&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;19&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;21&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;22&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;23&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;24&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;sup&amp;gt;25&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|n&lt;br /&gt;
|o&lt;br /&gt;
|p&lt;br /&gt;
|q&lt;br /&gt;
|r&lt;br /&gt;
|s&lt;br /&gt;
|t&lt;br /&gt;
|u&lt;br /&gt;
|v&lt;br /&gt;
|w&lt;br /&gt;
|x&lt;br /&gt;
|y&lt;br /&gt;
|z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* reprezintă fiecare număr ca un șir de cifre și litere obținut din scrierea acelui număr ca sumă de puteri ale lui &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;; dacă o putere este folosită de mai multe ori în descompunerea numărului atunci ea va fi precedată în șir de numărul de utilizări.&lt;br /&gt;
&lt;br /&gt;
Un număr poate fi reprezentat astfel în mai multe moduri. De exemplu, pentru numărul &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; printre variantele de reprezentare avem:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;100 = cfg = 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; = 4+32+64 = 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;100 = 2ab2cde2f = 2*2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;+2*2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;+24+2*2&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; = 2*1+2+2*4+8+16+2*32 = 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;100 = 16bcg = 16*2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; = 16*2+4+64 = 100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care rezolvă următoarele cerinţe:&lt;br /&gt;
&lt;br /&gt;
# cunoscând &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; numărul de stele dintr-o galaxie, determină o reprezentare codificată a acestui număr formată doar din litere mici distincte ordonate alfabetic;&lt;br /&gt;
# cunoscând &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt;, reprezentând numărul de galaxii și &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; numere în scriere codificată, reprezentând numărul de stele din fiecare galaxie, determină scrierea zecimală a numărului total de stele din cele &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; galaxii.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;stele.in&amp;lt;/code&amp;gt; conține pe prima linie un număr natural &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, reprezentând cerinţa care trebuie rezolvată (1 sau 2). Dacă cerinţa este 1, pe a doua linie se află un număr natural &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;, ce reprezintă numărul care trebuie codificat.&lt;br /&gt;
&lt;br /&gt;
Dacă cerinţa este 2, pe a doua linie se află un număr natural &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; reprezentând numărul de galaxii, iar pe următoarele &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; linii câte un șir de caractere reprezentând numărul de stele dintr-o galaxie, codificat folosind algoritmul descris mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;stele.out&amp;lt;/code&amp;gt; va conţine o singură linie pe care va fi scris un șir de litere mici distincte, ordonate alfabetic, reprezentând scrierea codificată a numărului &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; (dacă cerinţa este 1) sau un număr natural în scriere zecimală ce reprezintă numărul total de stele din cele &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; galaxii (dacă cerinţa este 2).&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ s ≤ 2&amp;lt;sup&amp;gt;26&amp;lt;/sup&amp;gt;-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ g ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Reprezentările codificate din fişierul de intrare pot avea maximum &amp;lt;code&amp;gt;420&amp;lt;/code&amp;gt; caractere.&lt;br /&gt;
* Numărul care poate apărea în fața unei litere poate avea maximum &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; cifre.&lt;br /&gt;
* Pentru teste valorând 30% din punctaj cerinţa este 1.&lt;br /&gt;
* Pentru teste corespunzătoare cerinţei 2 valorând 20% din punctaj valoarea obținută nu depășește &amp;lt;code&amp;gt;10&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;stele.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 100&lt;br /&gt;
&amp;lt;code&amp;gt;stele.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 cfg&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cerința este 1. Reprezentarea numărului &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;  care respectă cerinţa este: &amp;lt;code&amp;gt;cfg = 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; = 4+32+64 = 100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def num_to_code(s):&lt;br /&gt;
    powers_of_2 = [&lt;br /&gt;
        1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
        16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432&lt;br /&gt;
    ]&lt;br /&gt;
    letters = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    result = []&lt;br /&gt;
    i = len(powers_of_2) - 1&lt;br /&gt;
    while s &amp;gt; 0:&lt;br /&gt;
        if s &amp;gt;= powers_of_2[i]:&lt;br /&gt;
            result.append(letters[i])&lt;br /&gt;
            s -= powers_of_2[i]&lt;br /&gt;
        i -= 1&lt;br /&gt;
    &lt;br /&gt;
    return &#039;&#039;.join(sorted(result))&lt;br /&gt;
&lt;br /&gt;
def code_to_num(code):&lt;br /&gt;
    letters = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;&lt;br /&gt;
    powers_of_2 = {&lt;br /&gt;
        letter: 2 ** i for i, letter in enumerate(letters)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    total = 0&lt;br /&gt;
    for char in code:&lt;br /&gt;
        total += powers_of_2[char]&lt;br /&gt;
    &lt;br /&gt;
    return total&lt;br /&gt;
&lt;br /&gt;
def total_stars_in_galaxies(galaxies):&lt;br /&gt;
    total_stars = 0&lt;br /&gt;
    for galaxy in galaxies:&lt;br /&gt;
        total_stars += code_to_num(galaxy)&lt;br /&gt;
    return total_stars&lt;br /&gt;
&lt;br /&gt;
# Exemple de utilizare&lt;br /&gt;
s = 100&lt;br /&gt;
code_representation = num_to_code(s)&lt;br /&gt;
print(f&amp;quot;Reprezentarea codificată a numărului {s}: {code_representation}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
g = 3&lt;br /&gt;
galaxies = [&amp;quot;cfg&amp;quot;, &amp;quot;bcd&amp;quot;, &amp;quot;ace&amp;quot;]&lt;br /&gt;
total_stars = total_stars_in_galaxies(galaxies)&lt;br /&gt;
print(f&amp;quot;Numărul total de stele din {g} galaxii: {total_stars}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4137_-_rgb&amp;diff=10168</id>
		<title>4137 - rgb</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4137_-_rgb&amp;diff=10168"/>
		<updated>2024-07-23T11:29:48Z</updated>

		<summary type="html">&lt;p&gt;RaulOtet: Pagină nouă: Ionuţ, tânăr programator, se lansează pe piaţa producătorilor de jocuri pe calculator. Jocul pe care l-a proiectat se numeşte RGB. În joc există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; personaje extraterestre. Fiindcă Ionuţ nu este de acord cu teoria omuleţilor verzi, personajele lui sunt de trei culori:  * &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; extratereştri de culoare roşie; * &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; extratereştri de culoare verde; * &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; extratereştri de culoare albastră.  Fiecare extraterestru are o an...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ionuţ, tânăr programator, se lansează pe piaţa producătorilor de jocuri pe calculator. Jocul pe care l-a proiectat se numeşte RGB. În joc există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; personaje extraterestre. Fiindcă Ionuţ nu este de acord cu teoria omuleţilor verzi, personajele lui sunt de trei culori:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; extratereştri de culoare roşie;&lt;br /&gt;
* &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; extratereştri de culoare verde;&lt;br /&gt;
* &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; extratereştri de culoare albastră.&lt;br /&gt;
&lt;br /&gt;
Fiecare extraterestru are o anumită putere, exprimată printr-un număr natural impar, puterile oricăror doi extratereştri fiind diferite. Pe parcursul jocului fiecare extraterestru va lupta cu fiecare dintre ceilalţi extratereştri. Rezultatul unei lupte între doi extratereştri depinde de puterea acestora, dar şi de culoarea lor. Într-o luptă dintre doi extratereştri de aceeaşi culoare, va câştiga cel cu puterea cea mai mare. Într-o luptă între doi extratereştri de culori diferite, puterile lor se modifică după cum urmează, iar după modificare lupta o va câştiga extraterestrul cu puterea mai mare:&lt;br /&gt;
&lt;br /&gt;
* Puterea unui extraterestru roșu este dublată dacă adversarul este un extraterestru verde.&lt;br /&gt;
* Puterea unui extraterestru verde este dublată dacă adversarul este un extraterestru albastru.&lt;br /&gt;
* Puterea unui extraterestru albastru este dublată dacă adversarul este un extraterestru roșu.&lt;br /&gt;
&lt;br /&gt;
După fiecare luptă, puterile extratereștrilor revin la valorile inițiale, în caz că s-au modificat.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care, cunoscând culorile şi puterile extratereştrilor, rezolvă următoarele două cerinţe:&lt;br /&gt;
&lt;br /&gt;
1) determină puterea extraterestrului care câştigă cele mai multe lupte; dacă există mai mulţi astfel de extratereştri, se va afişa puterea minimă;&lt;br /&gt;
&lt;br /&gt;
2) determină pentru fiecare extraterestru numărul de lupte câştigate de acesta.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;rgb.in&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; este cerinţa care trebuie să fie rezolvată (1 sau 2), &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; reprezintă numărul de extratereștri roșii, &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; numărul de extratereștri verzi, iar &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; numărul de extratereștri albaştri. Pe cea de a doua linie se află &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; numere naturale impare în ordine strict crescătoare, reprezentând puterile celor R extratereștri roșii. Pe cea de a treia linie se află &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; numere naturale impare în ordine strict crescătoare, reprezentând puterile celor G extratereștri verzi. &lt;br /&gt;
&lt;br /&gt;
Pe cea de a patra linie se află &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; numere naturale impare în ordine strict crescătoare, reprezentând puterile celor B extratereștri albaştri. Valorile scrise pe aceeaşi linie sunt separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;C = 1&amp;lt;/code&amp;gt;, fişierul de ieşire &amp;lt;code&amp;gt;rgb.out&amp;lt;/code&amp;gt; va conţine o singură linie pe care va fi scrisă puterea extraterestrului care câştigă cele mai multe lupte; dacă există mai mulţi extratereştri care câştigă un număr maxim de lupte, se va afişa puterea minimă.Pentru &amp;lt;code&amp;gt;C = 2&amp;lt;/code&amp;gt;, fişierul de ieşire &amp;lt;code&amp;gt;rgb.out&amp;lt;/code&amp;gt; va conţine trei linii. Pe prima linie se va scrie numărul de lupte câştigate de fiecare extraterestru roșu. Pe a doua linie, se va scrie numărul de lupte câştigate de fiecare extraterestru verde. Pe a treia linie, se va scrie numărul de lupte câştigate de fiecare extraterestru albastru. Pentru fiecare culoare, valorile vor fi afişate considerând ordinea extratereştrilor din fişierul de intrare. Valorile scrise pe aceeaşi linie vor fi separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;N = R + G + B&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;N ≤ 500.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ R, G, B ≤ N-2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ puterea oricărui extraterestru ≤ 2 • N - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Datorită dimensiunilor mari, unele teste nu au fost adăugate&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;rgb.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 1 2 2&lt;br /&gt;
 3&lt;br /&gt;
 1 7&lt;br /&gt;
 5 9&lt;br /&gt;
&amp;lt;code&amp;gt;rgb.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;C = 1&amp;lt;/code&amp;gt;, deci se va rezolva prima cerinţă. Există un extraterestru roşu, care are puterea &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, doi extratereştri verzi, având puterile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; şi doi extratereştri albaștri cu puterile &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;. Extraterestrul cu puterea &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; este singurul care va câştiga cele mai multe lupte (în cazul acesta, chiar toate):&lt;br /&gt;
&lt;br /&gt;
* când luptă cu extraterestrul verde cu puterea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; câştigă, pentru că are puterea mai mare;&lt;br /&gt;
* când luptă cu extraterestrul roşu cu puterea &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, acesta îşi va dubla puterea (va avea puterea &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;), dar va fi insuficient pentru a câștiga lupta;&lt;br /&gt;
* când luptă contra extraterestrului albastru cu puterea &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;, va avea puterea dublată (&amp;lt;code&amp;gt;14&amp;lt;/code&amp;gt;), prin urmare va câştiga şi această luptă.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def determine_winner_and_counts(N, colors, powers):&lt;br /&gt;
    # Initialize the win counts&lt;br /&gt;
    win_counts = [0] * N&lt;br /&gt;
    &lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(i + 1, N):&lt;br /&gt;
            power_i = powers[i]&lt;br /&gt;
            power_j = powers[j]&lt;br /&gt;
            &lt;br /&gt;
            # Adjust powers based on the colors&lt;br /&gt;
            if colors[i] == &#039;R&#039; and colors[j] == &#039;G&#039;:&lt;br /&gt;
                power_i *= 2&lt;br /&gt;
            elif colors[i] == &#039;G&#039; and colors[j] == &#039;R&#039;:&lt;br /&gt;
                power_j *= 2&lt;br /&gt;
            elif colors[i] == &#039;G&#039; and colors[j] == &#039;B&#039;:&lt;br /&gt;
                power_i *= 2&lt;br /&gt;
            elif colors[i] == &#039;B&#039; and colors[j] == &#039;G&#039;:&lt;br /&gt;
                power_j *= 2&lt;br /&gt;
            elif colors[i] == &#039;B&#039; and colors[j] == &#039;R&#039;:&lt;br /&gt;
                power_i *= 2&lt;br /&gt;
            elif colors[i] == &#039;R&#039; and colors[j] == &#039;B&#039;:&lt;br /&gt;
                power_j *= 2&lt;br /&gt;
            &lt;br /&gt;
            # Determine winner&lt;br /&gt;
            if power_i &amp;gt; power_j:&lt;br /&gt;
                win_counts[i] += 1&lt;br /&gt;
            else:&lt;br /&gt;
                win_counts[j] += 1&lt;br /&gt;
    &lt;br /&gt;
    # Determine the extraterrestrial with the most wins&lt;br /&gt;
    max_wins = max(win_counts)&lt;br /&gt;
    winners = [powers[i] for i in range(N) if win_counts[i] == max_wins]&lt;br /&gt;
    min_power_winner = min(winners)&lt;br /&gt;
    &lt;br /&gt;
    return min_power_winner, win_counts&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
N = 5&lt;br /&gt;
colors = [&#039;R&#039;, &#039;G&#039;, &#039;B&#039;, &#039;R&#039;, &#039;G&#039;]&lt;br /&gt;
powers = [5, 3, 7, 9, 1]&lt;br /&gt;
&lt;br /&gt;
min_power_winner, win_counts = determine_winner_and_counts(N, colors, powers)&lt;br /&gt;
print(&amp;quot;Puterea extraterestrului cu cele mai multe lupte câștigate:&amp;quot;, min_power_winner)&lt;br /&gt;
print(&amp;quot;Numărul de lupte câștigate de fiecare extraterestru:&amp;quot;, win_counts)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
</feed>