<?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=2010_-_Fermier</id>
	<title>2010 - Fermier - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2010_-_Fermier"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2010_-_Fermier&amp;action=history"/>
	<updated>2026-05-01T02:50:01Z</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=2010_-_Fermier&amp;diff=10181&amp;oldid=prev</id>
		<title>RaulOtet: Pagină nouă: Dorel și-a achiziționat o fermă cu &lt;code&gt;n&lt;/code&gt; plantații și o mașină de transport cu o capacitate &lt;code&gt;c&lt;/code&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 &lt;code&gt;i&lt;/code&gt; și plantația &lt;code&gt;i+1&lt;/code&gt; (&lt;code&gt;1≤i≤n-1&lt;/code&gt;), precum și între depozit...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2010_-_Fermier&amp;diff=10181&amp;oldid=prev"/>
		<updated>2024-07-26T06:14:04Z</updated>

		<summary type="html">&lt;p&gt;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;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&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&amp;#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>
</feed>