<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1033_-_Elicop</id>
	<title>1033 - Elicop - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1033_-_Elicop"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1033_-_Elicop&amp;action=history"/>
	<updated>2026-05-01T08:03:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1033_-_Elicop&amp;diff=10185&amp;oldid=prev</id>
		<title>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 &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, …, &lt;code&gt;m&lt;/code&gt;, iar coloanele cu pătrăţele de gazon sunt numerotate de la stânga la dreapta cu numerele &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, …, &lt;code&gt;n&lt;/code&gt;. Din cauza tipului d...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1033_-_Elicop&amp;diff=10185&amp;oldid=prev"/>
		<updated>2024-07-26T08:11:44Z</updated>

		<summary type="html">&lt;p&gt;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;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&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 &amp;#039;&amp;#039;greşit&amp;#039;&amp;#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 &amp;#039;&amp;#039;greşit&amp;#039;&amp;#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 &amp;#039;&amp;#039;greşit&amp;#039;&amp;#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, &amp;#039;r&amp;#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, &amp;#039;w&amp;#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)} {&amp;#039; &amp;#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(&amp;#039;date.in&amp;#039;)&lt;br /&gt;
    n1, elicoptere_gresite = verifica_aterizari(m, n, a, k, elicoptere)&lt;br /&gt;
    scrie_rezultate(&amp;#039;date.out&amp;#039;, n1, elicoptere_gresite)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RaulOtet</name></author>
	</entry>
</feed>