Date: | Wed, 21 Mar 2001 22:26:42 -0500 |
From: | Ovidiu Gheorghioiu <ovy@MIT.EDU> | Block Address | Add to Address Book |
To: | probleme@ldc.ro |
Subject: | Re:(cristi) Probleme |
|
|
Draga lista,
N-aveam ce face si mi-am batut un pic capu' cu problemele astea. Acum
am
ce
face (din greu) asa ca o sa fiu cam succint, sper ca ma iertatzi.
Cristian Francu wrote:
> 1. Problema selectiei
> Dindu-se n numere reale (n < 10 milioane) intr-un fisier de intrare
si
> un numar k intre 1 si n sa se gaseasca cele mai mici k numere si sa
se
> afiseze intr-un fisier de iesire. Timpul de calcul (nu
citirea/scrierea
> din fisiere): sub o secunda. Complexitate ceruta: O(n) pe medie. Se
> considera ca puteti incarca toate numerele intr-un vector in memorie
> ($36/128MB).
Asta se face dragutz cu un Quixort... pe jumatate. E clar ca ajunge sa
gasesc
al k-ulea numar din vector. Dupa pasul de pivotare din Quixort calculez
in
care "jumatate" e numarul pe care-l caut si descind recursiv numai
acolo. Si,
in medie, e O(n+n/2+n/4+...) = O(n)
Dupa ce am ajuns la o rezolvare apropiata pe cont propriu, mi-am adus
aminte
ca o stiam pe asta. Desi nu mai stiu de unde. Probabil ca e relativ
cunoscuta
chestia.
>
>
> 2. Problema broastei revine
> Broasca pleaca din A si trebuie sa treaca prin B si C si apoi sa se
> intoarca. Drum minim. Flow-ul nu mai tine.
Hmm... Dar daca fac un flow de la A la B si C (sursa de 2 in a,
drain-uri de
1 in B si C), pe urma fac drain-ul din B sursa si il maresc pe ala din
C
cu
1? Daca nu-mi scapa ceva esential, ar trebui sa mearga.
>
>
>
> 3. Aria minima
> Se dau doua linii continue formate din segmente. Liniile sint date
prin
> coordonatele virfurilor: (x1, y1) (x2, y2) (x3, y3) ... (xn, yn).
Ambele
> linii au proprietatea ca x1 <= x2 <= x3 <= ... xn si ca x1 = 0, xn =
1
> (liniile sint deci functii continue definite pe intervalul [0, 1]).
>
> Se defineste suprafata dintre cele doua linii in mod natural, cum
v-ar
> veni in minte, ca fiind aria pe care o putem hasura intre cele doua
linii,
> inchisa si de dreptele x = 0, x = 1. Aria este fara semn.
>
> Dindu-se doua linii cu m, respectiv n segmente se cere sa se
calculeze
yt
> cu care trebuie translatata linia a doua de-a lungul axei y astfel
incit
> aria dintre cele doua linii sa fie minima.
>
> Complexitate ceruta: O(m + n). In conditii de concurs luati m si n ca
> fiind maxim 1 milion.
(intre timp complexitatea a crescut la O( (m+n) log (m+n) ) ceea ce e
absolut
esential)
Pai primul lucru ar fi sa obtinem aceleasi x-uri pt. amandoua liniile,
adica
interclasez vectorii de x-uri si tai segmentele in fiecare x (adica
amandoua
liniile au acum m+n segmente, sau mai putin daca sunt si unii egali).
Asta
simplifica mult toata treaba.
Ok. Acum pentru fiecare interval de pe axa x am fie un trapez fie o
doua
triunghiuri formate de doua segmente care se intersecteaza. Putina
geometrie
ne convinge ca aria acestei regiuni este: (Dx e "delta x",
diferenta
intre cei 2 icsi consecutivi, iar Dy este "delta y" y-ul cu care
translatez
adica.
S= { K + Dx * (A - Dy), Dy < A
{ K, A <= Dy <= B
{ K + Dx * (Dy - B), Dy > B
Lasam cititorului placerea de a determina constantele (fata de Dy) K,
A
si
B. De fapt de K putem uita complet de aici inainte.
Practic am 3 functii de gr. I, una pt. fiecare din intervalele det. de
A
si B
pe axa reala (a solutiilor posibile pt. Dy). Mai ramane sa le adun pe
intervale si sa determin minimul.
Pentru asta sortez toti A si B de mai sus, crescator sa zicem. Pornesc
cu
f(Dy) = M * Dy + N, unde M = - suma din Dx, adica 1, si N = suma din
Dx,
adica -1.
De fiecare data cand dau de un A, M = M + Dx, N = N - Dx * A, unde
Dx-ul
corespunde fireste acelui A. Similar pentru un B: M = M + Dx, N = N -
Dx
* B.
Inainte si dupa schimbare ma uit daca f(A) ( sau f(B) ) sunt mai mici
decat
minimul de pana acum si daca da iau masurile corespunzatoare.
Uitandu-ma la explicatia de mai sus, imi dau seama ca ar fi trebuit sa
pun
indici, si o gramada (la toate var. in afara de M, N si Dy). Dar va
descurcati voi :)
Ok tovarasi, eu ma intorc la dragutzul de proiect pe care il am de
redactat.
Numa' bine,
Ovy.
Privacy Policy-
Terms of Service
-
Guidelines
Copyright © 1994-2001
Yahoo! Inc. All rights reserved.