<?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=1498_-_Ciocolata</id>
	<title>1498 - Ciocolata - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1498_-_Ciocolata"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1498_-_Ciocolata&amp;action=history"/>
	<updated>2026-05-01T08:23:31Z</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=1498_-_Ciocolata&amp;diff=8918&amp;oldid=prev</id>
		<title>Andrada378: Pagină nouă: == Enunț == După un rezultat slăbuț la un concurs de informatică, Cristina s-a cam supărat. Dan vrea să-i ridice moralul și știe că cel mai bun mod în care poate face asta este ciocolata. Totuși, Dan nu este dispus să-i ofere Cristinei toată ciocolata pe care o are (și el a avut un rezultat slab la concurs, deci.. și el trebuie să-și ridice moralul).  Astfel, îi propune Cristinei următoarea ofertă: ”Desenează pe o hârtie un caroiaj format din N linii...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1498_-_Ciocolata&amp;diff=8918&amp;oldid=prev"/>
		<updated>2024-01-03T20:40:39Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Enunț == După un rezultat slăbuț la un concurs de informatică, Cristina s-a cam supărat. Dan vrea să-i ridice moralul și știe că cel mai bun mod în care poate face asta este ciocolata. Totuși, Dan nu este dispus să-i ofere Cristinei toată ciocolata pe care o are (și el a avut un rezultat slab la concurs, deci.. și el trebuie să-și ridice moralul).  Astfel, îi propune Cristinei următoarea ofertă: ”Desenează pe o hârtie un caroiaj format din N linii...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Enunț ==&lt;br /&gt;
După un rezultat slăbuț la un concurs de informatică, Cristina s-a cam supărat. Dan vrea să-i ridice moralul și știe că cel mai bun mod în care poate face asta este ciocolata. Totuși, Dan nu este dispus să-i ofere Cristinei toată ciocolata pe care o are (și el a avut un rezultat slab la concurs, deci.. și el trebuie să-și ridice moralul).&lt;br /&gt;
&lt;br /&gt;
Astfel, îi propune Cristinei următoarea ofertă: ”Desenează pe o hârtie un caroiaj format din N linii și M coloane pe care îl umple cu valori întregi. Cristina va primi un număr de pătrățele de ciocolată egal cu suma valorilor dintr-un dreptunghi ales de ea.”&lt;br /&gt;
&lt;br /&gt;
Deoarece Cristina este prea bosumflată ca să rezolve această “provocare” și prea obosită ca să-l convingă pe Dan să-i dea ciocolata pur și simplu, vă roagă pe voi să o ajutați. (Poate primiți și voi niște ciocolată dacă rezolvați problema. Poate…)&lt;br /&gt;
&lt;br /&gt;
== Cerința ==&lt;br /&gt;
Cunoscându-se configurația caroiajului, determinați numărul maxim de pătrățele de ciocolată pe care Cristina îl poate obține alegând un dreptunghi din matrice, precum și coordonatele celor patru colțuri ale acestuia&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul ciocolatain.txt conține pe prima linie două numere naturale N și M reprezentând numărul de linii și numărul de coloane ale caroiajului. Pe următoarele N linii se găsesc câte M valori întregi reprezentând valorile din caroiaj.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fisierul ciocolataout.txt va conține pe prima linie numărul maxim de pătrățele de ciocolată care se poate obține. Pe a doua linie se vor afla patru numere naturale reprezentând coordonatele colțurilor stânga- sus și dreapta-sus (în această ordine) a dreptunghiului ales. Pe cea de-a treia linie se vor afla tot patru numere naturale reprezentând coordonatele colțurilor stânga-jos și dreapta-jos (în această ordine) a dreptunghiului ales.&lt;br /&gt;
&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
&lt;br /&gt;
* 1 ≤ N, M ≤ 500&lt;br /&gt;
* Valorile din caroiaj aparțin intervalului [ -2.000.000.000 , 2.000.000.000 ]&lt;br /&gt;
* În cazul în care există mai multe dreptunghiuri din care se obține aceeași valoare maximă, se va alege cel cu indicele de linie al colțului stânga-sus minim. În cazul în care există mai multe dreptunghiuri cu această proprietate, se va alege cel ce are și indicele de coloană al colțului stânga-sus minim. Dacă există mai multe soluții cu proprietatea că au colțul stânga-sus cu indicii de linie și de coloană minimi, se va alege cel cu indicele de linie al coltului dreapta-jos minim. Dacă mai rămân soluții multiple, se va alege cel care are și indicele de coloană al colțului dreapta-jos minim.&lt;br /&gt;
* (schematic: valoare maximă → indice linie stânga-sus minim → indice coloană stânga-sus minim → indice linie dreapta-jos minim → indice coloană dreapta-jos minim )&lt;br /&gt;
* Se garantează că nici Cristinei și nici lui Dan nu li se va face rău de la ciocolată.&lt;br /&gt;
&lt;br /&gt;
== Exemplu: ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ciocolatain.txt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
5 9&lt;br /&gt;
&lt;br /&gt;
3 4 -12 4 6 7 -9 5 12&lt;br /&gt;
&lt;br /&gt;
0 4 5 7 9 -5 1 1 5&lt;br /&gt;
&lt;br /&gt;
0 98 34 0 1 7 -7 1 1&lt;br /&gt;
&lt;br /&gt;
6 7 8 -9 0 -2 3 5 22&lt;br /&gt;
&lt;br /&gt;
47 62 -31 55 0 -83 23 77 -10&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ciocolataout.txt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
362&lt;br /&gt;
&lt;br /&gt;
1 1 1 9&lt;br /&gt;
&lt;br /&gt;
5 1 5 9&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Dreptunghiul determinat de punctele (1, 1), (1, 9), (5, 1), (5, 9).&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def is_valid_input(n, m, a):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 500) or not (1 &amp;lt;= m &amp;lt;= 500):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if not (-2_000_000_000 &amp;lt;= a[i][j] &amp;lt;= 2_000_000_000):&lt;br /&gt;
                return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def citeste_input(file_name=&amp;quot;ciocolatain.txt&amp;quot;):&lt;br /&gt;
    with open(file_name, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n, m = map(int, file.readline().split())&lt;br /&gt;
        a = [list(map(int, file.readline().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    if not is_valid_input(n, m, a):&lt;br /&gt;
        raise ValueError(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    return n, m, a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scrie_output(smax, x1, y1, lx, ly, file_name=&amp;quot;ciocolataout.txt&amp;quot;):&lt;br /&gt;
    with open(file_name, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
        file.write(f&amp;quot;{smax}\n&amp;quot;)&lt;br /&gt;
        file.write(f&amp;quot;{x1} {y1} {x1} {y1 + ly}\n&amp;quot;)&lt;br /&gt;
        file.write(f&amp;quot;{x1 + lx} {y1} {x1 + lx} {y1 + ly}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def gaseste_subsir_maxim(n, m, a):&lt;br /&gt;
    s = [[0] * (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;
            s[i][j] = a[i - 1][j - 1] + s[i - 1][j]&lt;br /&gt;
&lt;br /&gt;
    smax, x1, y1, lx, ly = 0, 0, 0, 0, 0&lt;br /&gt;
&lt;br /&gt;
    for p in range(1, n + 1):&lt;br /&gt;
        for q in range(p, n + 1):&lt;br /&gt;
            sum_val = 0&lt;br /&gt;
            lasty = 1&lt;br /&gt;
            for j in range(1, m + 1):&lt;br /&gt;
                s1 = s[q][j] - s[p - 1][j]&lt;br /&gt;
                sum_val += s1&lt;br /&gt;
                if sum_val &amp;lt; 0:&lt;br /&gt;
                    sum_val = 0&lt;br /&gt;
                    lasty = j + 1&lt;br /&gt;
                if sum_val &amp;gt; smax or (sum_val == smax and (p &amp;lt; x1 or (p == x1 and lasty &amp;lt; y1))):&lt;br /&gt;
                    smax = sum_val&lt;br /&gt;
                    x1 = p&lt;br /&gt;
                    y1 = lasty&lt;br /&gt;
                    lx = q - p&lt;br /&gt;
                    ly = j - lasty&lt;br /&gt;
&lt;br /&gt;
    return smax, x1, y1, lx, ly&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n, m, a = citeste_input()&lt;br /&gt;
    smax, x1, y1, lx, ly = gaseste_subsir_maxim(n, m, a)&lt;br /&gt;
    scrie_output(smax, x1, y1, lx, ly)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andrada378</name></author>
	</entry>
</feed>