Păcală a primit, aşa cum era învoiala, un petec de teren de pe moşia boierului. Terenul este împrejmuit complet cu segmente drepte de gard ce se sprijină la ambele capete de câte un par zdravăn. La o nouă prinsoare, Păcală iese iar in câştig şi primeşte dreptul să strămute nişte pari, unul câte unul, cum i-o fi voia, astfel încât să-şi extindă suprafaţa de teren. Dar învoiala prevede că fiecare par poate fi mutat în orice direcţie, dar nu pe o distanţă mai mare decât o valoare dată (scrisă pe fiecare par) şi fiecare segment de gard, fiind cam şubred, poate fi rotit şi prelungit de la un singur capăt, celălalt rămânând nemişcat.
Cerința
Cunoscând poziţiile iniţiale ale parilor şi valoarea înscrisă pe fiecare par, se cere suprafaţa maximă cu care poate să-şi extindă Păcală proprietatea. Se ştie că parii sunt daţi într-o ordine oarecare, poziţiile lor iniţiale sunt date prin numere întregi de cel mult 3
cifre, distanțele pe care fiecare par poate fi deplasat sunt numere naturale strict pozitive şi figura formată de terenul iniţial este un poligon neconcav.
Date de intrare
Fișierul de intrare mosia1.in
conţine n+1
linii cu următoarele valori:
n
– numărul de pari
x[1] y[1] d[1]
– coordonatele iniţiale şi distanţa pe care poate fi mutat parul 1
x[2] y[2] d[2]
– coordonatele iniţiale şi distanţa pe care poate fi mutat parul 2
. . .
x[n] y[n] d[n]
– coordonatele iniţiale şi distanţa pe care poate fi mutat parul n
Date de ieșire
Fișierul de ieșire mosia1.out
se scrie un număr real cu 4
zecimale ce reprezintă suprafața maximă cu care se poate mări moșia.
Restricții și precizări
3 < N ≤ 200
număr natural–1000 < x[i], y[i] < 1000
numere întregi0 < d[i] ≤ 20
numere întregi- poligonul neconcav se defineşte ca un poligon convex cu unele vârfuri coliniare
- poziţiile parilor sunt date într-o ordine oarecare
- poligonul obţinut după mutarea parilor poate fi concav
- poziţiile finale ale parilor nu sunt in mod obligatoriu numere naturale
Exemplu
mosia1.in
4 -3 0 2 3 0 3 0 6 2 0 -6 6
mosia1.out
30.0000
Explicație
Prin mutarea parilor 1
si 2
cu câte 2
și respectiv 3
unități, se obține un teren având suprafaţa cu 30
de unităţi mai mare decât terenul iniţial.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema mosia1:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct my{
ll x,y,h;
} V[1100],St[1100];
int N,poz=1;
double D[1100],D2[1100],gx,gy;
double dist(my a,my b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
int main()
{
ifstream fin("mosia1.in");
ofstream fout("mosia1.out");
fin >> N;
for(int i = 1;i<=N;i++)
{
fin >> V[i].x >> V[i].y >> V[i].h;
gx+=V[i].x,gy+=V[i].y;
}
gx/=N,gy/=N;
sort(V+1,V+N+1,[&](my a,my b){return atan2(a.y-gy,a.x-gx) < atan2(b.y-gy,b.x-gx);});
V[0] = V[N]; V[N+1] = V[1];
for(int i = 1;i<=N;++i) D2[i] = D[i] = V[i].h*dist(V[i-1],V[i+1])/2.0;
D[N] = D2[1] = 0;
for(int i = 2;i<=N;++i) D[i] = max(D[i-1],D[i]+D[i-2]);
for(int i = 2;i<=N;++i) D2[i] = max(D2[i-1],D2[i]+D2[i-2]);
fout << fixed << setprecision(6) << max(D[N],D2[N]);
fout.close();
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2387 mosia1
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2387 mosia1 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!