infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Mircea Pasoi din Februarie 21, 2005, 20:20:07



Titlul: 047 Trapez
Scris de: Mircea Pasoi din Februarie 21, 2005, 20:20:07
Aici puteţi discuta despre problema Trapez (http://infoarena.ro/problema/trapez).


Titlul: 047 Trapez
Scris de: vladut.forum din August 30, 2005, 19:40:43
auleu, n-am nici o idee, (doarO(n^4):D)
pressupun ca O(n^2) ar fii destul de bun.
dati-mi si mie un hint, ca daca era sa descoper cate paralelograme sunt era mai simplu, (s-a dat la .Campion), da la trapeze nu mai merge faza.
sau poate sa mentin ideea de la paralelograme, astfel incat cand iau doua puncte, mijlocul il pun mai imaginar, adica pun mijlocul unde ar tb sa fie daca acel segment ar fii de lungime maxima, adica consider ca toate segmentele sunt egale, pot spune egale cu cel mai mare segment...
adica daca am segmentu [------] este de lungime 6, dar segmentul maxim are lungimea 8, sa spunem deci am sa pun mijlocul [----|--] sau [--|-----], da nu cred ca merge...infine datimi un hint mc ;)


Titlul: 047 Trapez
Scris de: Vlad Berteanu din August 30, 2005, 19:45:14
Eu am facut problema asa:
 am luat oricare 2 puncte, le-am calculat panta, am sortat pantele si de aici de descurci tu. Oricare 2 pante egale determina un trapez.  :wink:


Titlul: 047 Trapez
Scris de: vladut.forum din August 30, 2005, 19:50:37
aha ai dreptate, mc mult, la paralelograme e, iei oricare 2 puncte si retii mijlocul, sortezi vectorul cu mijloacele, si te descurci mai departe...

da mai uite ca nu m-am gandit


Titlul: 047 Trapez
Scris de: vladut.forum din August 31, 2005, 09:28:18
mah tu cum calculezi panta, ca eu o calculez asa
fac sin, cu dreapta care intersecteaza punctul cel mai de jos si e paralela cu Ox,
si lucrez in sin ^ 2, ca sa nu intru in double
a=y-y[j];
a=a*a;
b=distanta dintre punctul i, si punctul j
etc


Titlul: 047 Trapez
Scris de: Vlad Berteanu din August 31, 2005, 10:12:32
Considerand doua puncte, unul de coordonate Xa,Ya si altul de coord Xb,Yb , panta dreptei pe care se afla aceste doua puncte este:

 m=(Yb-Ya)/(Xb-Xa);


Titlul: 047 Trapez
Scris de: Filip Cristian Buruiana din August 31, 2005, 10:34:33
Bineinteles ca mai exista un caz particular daca faci asa: trebuie sa consideri si cand dreapta ta este paralela cu Oy, adica Xa = Xb...


Titlul: 047 Trapez
Scris de: vladut.forum din August 31, 2005, 11:43:19
dap, le consider si pe alea, astea paralele le numar separat, adica numarparalele OX si numar si paralele OY
las si eu codul poate imi spune careva unde gresesc...

eu determin panta ca fiind patratul sinusul unghiului dintre segment si OX
am vectorii p1[] si p2[], cu semnificatia panta(i)=p1/p2;
obs ca la un moment dat imultesc cu -1, pt ca segmentul are alta orientare... adika asa / sau \ asa...
unu-numar alea paralele cu Oy
doi-numar alea paralele cu Ox
Cod:

for (i=0; i<n-1; i++)
     for (j=i+1; j<n; j++) {
          if (x[i]-x[j]==0) unu++;
          else if (y[i]-y[j]==0) doi++;
          else {
                 a=(y[i]-y[j]);
                 b=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
                 p1[k]=a*a;
                 if (x[i]<x[j]&&y[i]>y[j]) p1[k]*=-1;
                 else if (x[i]>x[j]&&y[i]<y[j]) p1[k]*=-1;
                 p2[k]=b;k++;
                 }
         }

dupa asta sortez cu qsort, sortarea e buna, garantez...
apoi
gasesc solutia ca fiind,
la un moment dat caut cea mai mare succesiune de pante egale,
si numarul trapezelor v-a creste cu n*(n-1)/2; unde n-lungimea succesiunii

si mai adaug unu*(unu-1)/2;
si doi*(doi-1)/2;
si afisez...
lucrez in long long
afisez cu %ull
afisez si sfarsit de linie


Titlul: 047 Trapez
Scris de: Vlad Berteanu din August 31, 2005, 12:36:42
Daca imi aduc bine aminte eu nu calculam efectiv panta. Pentru fiecare segment tineam minte din panta numaratorul si numitorul si apoi la soratare faceam produsul mezilor si produsul extremilor ca sa compar si asa evitam kestia cu paralelismul OX sau OY.


Titlul: 047 Trapez
Scris de: vladut.forum din August 31, 2005, 13:31:47
pai mai ti-am zis ca nu se pune nici la mine problema de paralelism, eu alea le tin separat, ca e mai simplu...
apoi la panta tin si eu numaratorul si numitroul iar la sortare fac produsul mezilor = produsul extremilor...


Titlul: 047 Trapez
Scris de: Cosmin Negruseri din August 31, 2005, 17:52:11
Poti sa tii pante ca perechi de numarator numitor, dar fractia tre sa fie ireductibila si atunci doua pante sunt egale cand numaratorii respectiv numitorii sunt egali.


Titlul: 047 Trapez
Scris de: Alb Gabriel din Septembrie 28, 2005, 17:33:47
Imi puteti spune va rog cat da pt n = 8 ?

Shi punctele:

0 0
1 3
2 0
4 5
3 6
2 7
1 1
4 3

Scuze, am uitat de ele.


Titlul: 047 Trapez
Scris de: Bogdan-Cristian Tataroiu din Septembrie 29, 2005, 14:12:27
15


Titlul: 047 Trapez
Scris de: Rus Cristian din Octombrie 01, 2005, 19:12:41
Raspunsul e 24...oricum...traba sa fie par...trebuie numarate de 2 ori trapezele...sunt trapeze in ambele sensuri...


Titlul: 047 Trapez
Scris de: Bogdan-Cristian Tataroiu din Octombrie 01, 2005, 19:24:49
Am obtinut 15 cu sursa care ia punctaj maxim. Oricum m-am uitat pe datele de intrate si am observat ca 4 5, 3 6, 2 7 sunt puncte coliniare, dar in problema se specifica ca oricare 3 puncte sunt necoliniare.


Titlul: 047 Trapez
Scris de: Rus Cristian din Octombrie 02, 2005, 10:04:32
Aha...scuze...la asta nu m-am gandit...da...oricum...nu trebuia sa fie numar par?


Titlul: 047 Trapez
Scris de: u-92 din Octombrie 02, 2005, 12:26:11
cum adica le numeri in ambele sensuri? asa numeri de doua ori acelasi trapez.. nu trebuie neaparat ca raspunsul sa fie par


Titlul: 047 Trapez
Scris de: Rus Cristian din Octombrie 29, 2005, 09:57:19
mah...hash-u asta...defapt inseamna...sa gasesti o formula pt care sa aduni toate pantele la un loc?..si dupa aia aduni...da...trasa sa gasesti o formula ca se la comprimi?...dati ceva exemplu...


Titlul: 047 Trapez
Scris de: Mircea Pasoi din Octombrie 29, 2005, 11:18:20
Citat din mesajul lui: cristy
mah...hash-u asta...defapt inseamna...sa gasesti o formula pt care sa aduni toate pantele la un loc?..si dupa aia aduni...da...trasa sa gasesti o formula ca se la comprimi?...dati ceva exemplu...


Citeste articolul de hashing de pe http://info.devnet.ro


Titlul: 047 Trapez
Scris de: Rus Cristian din Noiembrie 05, 2005, 09:45:35
ce cazuri particulare sunt aici?...ca iau 70 de pct ca nu ma prind...am facut 1000 de exemple da nu ma prind...iau WA pe 3 teste, 2,7,8...


Titlul: 047 Trapez
Scris de: Filip Cristian Buruiana din Noiembrie 05, 2005, 15:01:26
Nici eu nu luam testele alea pentru ca foloseam precizie prea mica. Cand am folosit o precizie mare de 10^(-14) luam 100... Mai merge si sa nu faci impartire propriu-zisa, si sa compari fractii inmultind numitorii si numaratorii corespunzatori pe 64 biti si comparand cele doua produse ( asa e si mai exact... )


Titlul: 047 Trapez
Scris de: Rus Cristian din Noiembrie 05, 2005, 22:38:38
eu am facut pur si simplu compararea produsului numitorilor si numaratorilor...da nu pe 64 de biti...pe 32 de biti...oare de aici sa fie problema?...


Titlul: 047 Trapez
Scris de: Bogdan-Cristian Tataroiu din Noiembrie 06, 2005, 08:59:23
Da, cel mai probabil acolo e problema.


Titlul: 047 Trapez
Scris de: Filip Cristian Buruiana din Noiembrie 06, 2005, 13:32:49
Si vezi ca nu este suficienta numai compararea produsului... De exemplu, 2/(-3) < 2/5, dar 10 > -6...  :!:


Titlul: 047 Trapez
Scris de: Rus Cristian din Noiembrie 07, 2005, 22:02:46
dar de ce conteaza si altceva decat produsul?...eu am facut simplificarile...si daca numitorul era cu minus, inmulteam fractia cu -1, si cat de cat...dupa sortare...erau toate in acelasi loc, adica...valorile probabil nu erau toate in ordine crescatoare...dar macar erau cele egale una langa cealalta...si de aici era usor...


Titlul: De ce imi iese din timp?
Scris de: nivan din Noiembrie 08, 2005, 17:51:37
Este explicabil de ce iese din timp.
Ma gandesc ca as mai putea pune niste conditii la punctele de le aleg cand calcyulez panta astfel incat sa reduc la mai putine puncte shi sa pot sa parcurc ulteror vectorul cu pante sa intre in timp. Sper k ma puteti ajuta.
Cod:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

long i,j,n,m,trap;
float a[1000000],x[1001],y[1001];

void quick(long li, long ls)
{
 long i,j; float x,y;
 i=li; j=ls; x=a[(li+ls)/2];
 while (i<=j)
      {
       while (a[i]>x) i++;
       while (a[j]<x) j--;
       if (i<=j)
{
 y=a[i]; a[i]=a[j]; a[j]=y;
 i++; j--;
}
      }
 if (i<ls) quick(i,ls);
 if (j>li) quick(li,j);
}

int main()
{
 FILE *f=fopen("trapez.in","r");
 fscanf(f,"%ld",&n);
 for (i=1;i<=n;i++)
    fscanf(f,"%ld%ld",&x[i],&y[i]);
 fclose(f);

 long h=0;
 printf("\n");

 for (i=1;i<=n-1;i++)
 for (j=i+1;j<=n;j++)
    if (i != j)
      {
       h++;
       if (x[j]-x[i] == 0)
a[h]=0;
else if (y[j]-y[i] == 0)
a[h]=2500000000;
else a[h]=(y[j]-y[i])/(x[j]-x[i]);
       printf("%ld %ld %f\n",i,j,a[h]);
      }

 quick(1,h);
 trap=0;
 for (i=1;i<=h-1;i++)
    if (a[i]==a[i+1])
      trap++;

 FILE *g=fopen("trapez.out","w");
 fprintf(g,"%ld",trap);
 fclose(g);
 return 0;
 }


Titlul: Re: De ce imi iese din timp?
Scris de: nivan din Noiembrie 10, 2005, 12:31:33
Gata am rezolvat problema cu faptul ca iesea din timp..... eram eu idiot shi imi ramasese ceva printat pe ecran  eh...dar nu asta e problema acuma imi da WA pe testele pe care imi dadea atuncea TLE. Cumva nu trebuie sa calculez panta pe reale, ca am citit prin probleme ca se creeaza erori de precizie (dar daca nu merge pe reale.... pei pe ce pot stoca panta cre este practic un raport)


Titlul: 047 Trapez
Scris de: ditzone din Noiembrie 10, 2005, 15:06:54
Inainte sa postezi ceva citeste cu atentie ce s-a mai discutat la acel topic.. deoarece poate exista raspunsul la intrebarea ta deja... cum de altfel e si in cazul de fata....


Titlul: 047 Trapez
Scris de: Valentin Stanciu din Noiembrie 16, 2005, 16:43:28
pentru cei care faceti calcule pe reale in C, la calcularea pantei, puteti sa folositi atan2(y,x)!
atan2 este o functie care returneaza unghiul in radianti si este corecta si in cazurile de paralelism cu axele! Dar atentie, repet, ea returneaza unghiul dintre 2 puncte, NU panta; pentru aflarea pantei mai trebuie facut un calcul


Titlul: 047 Trapez
Scris de: Sima Mihai Cotizo -vechi din Decembrie 28, 2005, 16:11:33
Citat din mesajul lui: cristy
dar de ce conteaza si altceva decat produsul?...eu am facut simplificarile...si daca numitorul era cu minus, inmulteam fractia cu -1, si cat de cat...dupa sortare...erau toate in acelasi loc, adica...valorile probabil nu erau toate in ordine crescatoare...dar macar erau cele egale una langa cealalta...si de aici era usor...


si eu am luat produsul, am sortat, am tinut seama de schema cu -1... si tot iau WA la testele 2,7,8 ... si sigur evaluarea unei expresii o face pe 64 de biti in FPC... ce are? exista raspunsuri care ies din int64?  :cry:


Titlul: Raspuns: 047 Trapez
Scris de: Codrea Marcel din Iunie 29, 2006, 16:47:54
Stie cineva daca se poate evita lucrul pe 64 biti aducand fractiile pantelor la o forma ireductibila si dupa aceea ordonand cu qsort dupa numarator(unde numaratorul este egal dupa numitor) si adunand la rezultat nr*(nr-1)/2 unde nr reprezinta numarul de rapoarte consecutive egale(numarator=numitor)?Sursa imi ia 60 p(restul WA) si as vrea sa stiu daca este de vina rationamentul sau am gresit la implementare!
Am tinut cont de dreptele paralele cu axele si am mutat "-" sus pentru a evita cazurile in care -2/4 si 2/-4  nu sunt consecutive in urma ordonarii!!!

P.S.  ](*,)

Multumesc anticipat !    :D


Titlul: Raspuns: 047 Trapez
Scris de: Toma Radu din Iunie 29, 2006, 17:58:15
Rationamentul este bun, la implementare e buba. Vezi daca nu ai implementat gresit qsort-ul sau descompunerea in fractii ireductibile. Poti incerca si metoda in care tii fiecare raport nu ca numitor si numarator, ci direct ca numar real, numai sa ai grija cand verifici egalitatea.


Titlul: Raspuns: 047 Trapez
Scris de: Codrea Marcel din Iunie 30, 2006, 10:57:12
am reusit sa iau 100  :winner3: pana la urma...era o greseala la implementare pe la linia 117 si mi-a luat ceva vreme;oricum nu stiti unde as putea sa aflu ceva despre numerele pe 64 biti,ca nu am gasit articol si nici la scoala nu am invatat despre asa ceva ?


Titlul: Raspuns: 047 Trapez
Scris de: Filip Cristian Buruiana din Iunie 30, 2006, 11:08:26
"Numerele pe 64 de biti" este acelasi lucru ca si numerele pe "32 de biti" ( adica long / int sub Linux ) sau " 16 biti " ( int sub Windows ). In C/C++ declari pur si simplu "long long a" ( variabila a este de 64 de biti ), iar in Pascal "var a:int64". 64 de biti inseamna ca un bit este ocupat de semn, iar restul de cate o cifra in baza 2 ( 0 sau 1 ). Astfel, numarul maxim pe 64 de biti este 111..1111 - unde 1 apare de 63 de ori ( pentru ca al 64-lea bit este alocat pentru semn, + sau - ), deci valoarea maxima este 2^63 - 1... Atata tot, cu precizarea ca poti folosi exact aceleasi operatii ca si pentru numerele pe 16 / 32 biti...   


Titlul: Raspuns: 047 Trapez
Scris de: Codrea Marcel din Iunie 30, 2006, 12:24:59
Merci pentru informatie!!! :peacefingers:


Titlul: Răspuns: 047 Trapez
Scris de: Gabriel Bitis din August 13, 2007, 11:59:21
imi da cineva o idee cum sa sortez dupa panta fara sa fac impartirea y/x ?


Titlul: Răspuns: 047 Trapez
Scris de: Andrei Homorodean din August 13, 2007, 12:22:24
Eu m-am chinuit sa fac sortarea fara impartire si nu mi-a iesit. Am schimbat in impartire si a mers din prima, dar vezi sa folosesti ceva precizie..


Titlul: Răspuns: 047 Trapez
Scris de: Savin Tiberiu din August 13, 2007, 12:23:17
pai poti compara 2 fractii aducandule la acelasi numitor. Banuiesc ca dak stii sa le compari vei putea face si sortarea.


Titlul: Răspuns: 047 Trapez
Scris de: nash mit din Martie 12, 2008, 23:06:15
Ok ... problema asta este simpla .. insa .. nu stiu de ce nu iau decat 0 ... poate sa imi dea cineva un test ca la mine merge pe toate ....


Titlul: Răspuns: 047 Trapez
Scris de: Bondane Cosmin din Martie 13, 2008, 09:43:58
Uite aici unu:

Cod:
7
1 5
3 5
1 2
1 4
3 7
2 4
2 6

Cod:
10


Titlul: Răspuns: 047 Trapez
Scris de: Florea Mihai Alexandru din Aprilie 11, 2008, 20:46:09
Uite aici unu:

Cod:
7
1 5
3 5
1 2
1 4
3 7
2 4
2 6

Cod:
10


pentru testu' asta mie imi da
Cod:
14

cu sursa pe care am luat 100 de pct


Titlul: Răspuns: 047 Trapez
Scris de: Andrei Misarca din Aprilie 11, 2008, 22:28:10
Citat
Oricare trei puncte sunt necoliniare

Printre alea tu ai trei puncte coliniare((1 2), (1 4), (1 5))  probabil de aia obtineti rezultate diferite.


Titlul: Răspuns: 047 Trapez
Scris de: Oancea Catalin din Decembrie 26, 2010, 18:23:43
dati-mi si mie niste teste va rog... iau wA pe 8 teste ( si pe celelate 2 teste iau TLE  :rotfl: )


Titlul: Răspuns: 047 Trapez
Scris de: Alexandru-Iancu Caragicu din Februarie 07, 2011, 21:34:13
Punctele se pot repeta? (cred ca nu)


Titlul: Răspuns: 047 Trapez
Scris de: David Gergely din Noiembrie 05, 2014, 23:48:13
Contactează autorul problemei:
Evaluatorul nu a returnat un număr la stdout pe testul 1 (se ignoră spaţii, newline, etc)


Ciudat, numai exista fisiere in ?