<?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=0750_-_S_Min</id>
	<title>0750 - S Min - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=0750_-_S_Min"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0750_-_S_Min&amp;action=history"/>
	<updated>2026-05-02T23:31:02Z</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=0750_-_S_Min&amp;diff=10178&amp;oldid=prev</id>
		<title>RaulOtet: Pagină nouă: Ana are un joc nou. Pe o tablă pătrată este trasat un grid format din celule pătratice de dimensiune &lt;code&gt;1&lt;/code&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 &lt;code&gt;n&lt;/code&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...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0750_-_S_Min&amp;diff=10178&amp;oldid=prev"/>
		<updated>2024-07-25T12:38:29Z</updated>

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