Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 394 Vila 2  (Citit de 4202 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« : Martie 30, 2007, 20:56:42 »

Aici puteţi discuta despre problema Vila 2.
Memorat
Dastas
Vorbaret
****

Karma: 11
Deconectat Deconectat

Mesaje: 170



Vezi Profilul
« Răspunde #1 : August 31, 2007, 23:46:54 »

Imi spuneti va rog cum ar functiona un deque care retine minimul pe exemplu? Am citit tot ce am gasit despre structura asta pe forum si tot nu-mi dau seama exact cum functioneaza  Embarassed
Memorat
peanutz
Nu mai tace
*****

Karma: 10
Deconectat Deconectat

Mesaje: 296



Vezi Profilul
« Răspunde #2 : Septembrie 01, 2007, 00:35:32 »

Probabil cel mai bine ar fi sa vezi un deque, pentru ca nu e mare scofala. Da-mi un msg cu adresa de mail.
Memorat

....staind....
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #3 : Septembrie 01, 2007, 13:32:11 »

Imi spuneti va rog cum ar functiona un deque care retine minimul pe exemplu? Am citit tot ce am gasit despre structura asta pe forum si tot nu-mi dau seama exact cum functioneaza  Embarassed

In deque incerci sa obtii varsta minima a unui vecin, pentru a maximaliza diferenta. (Nu trebuie sa tii si maximul pentru ca daca i e vecin cu j, atunci si j e vecin cu i.) La pasul i, cat timp ultimul element din deque este mai mare ca elementul de pe pozitia i+k, il scoti. Apoi adaugi in deque elementul de pe pozitia i+k. Verifici daca diferenta dintre elementul i si minimul din deque (varful deque-ului) este mai mare ca solutia ta si eventual actualizezi. Ultimul pas este sa verifici daca varful deque-ului este elementul de pe pozitia i-k si in acest caz il scoti, deoarece paraseste zona vecinilor care intereseaza. 
Memorat

Am zis Mr. Green
Dastas
Vorbaret
****

Karma: 11
Deconectat Deconectat

Mesaje: 170



Vezi Profilul
« Răspunde #4 : Septembrie 01, 2007, 14:02:16 »

Va multumesc la amandoi, mi-a iesit pana la urma Smile
Memorat
alex_mircescu
Client obisnuit
**

Karma: -15
Deconectat Deconectat

Mesaje: 55



Vezi Profilul
« Răspunde #5 : Septembrie 13, 2008, 19:21:44 »

Ma ajutati si pe mine cu un test care sa aiba legatura cu #1??
Chiar nu stiu ce are... am incercat o tona de posibilitati...
Iau WA pe el... nu am probleme cu timpu' 

... Eh?

LE: Nu m-am prins inca... nu gasesc nimic...  Embarassed

LLE: Am uitat sa spun ca mi-o iesit  Very Happy
« Ultima modificare: Octombrie 22, 2008, 11:21:36 de către Alex Mircescu » Memorat
stocarul
Nu mai tace
*****

Karma: 49
Deconectat Deconectat

Mesaje: 203



Vezi Profilul
« Răspunde #6 : Martie 10, 2009, 19:05:56 »

Am icnercat si eu o rezolvare la problema asta.
Si din pacate iau doar 60 pct  Brick wall

Fac cu un deque pentru varsta maxima din interval, si apoi o compar cu varsta curenta...daca e mai mare decat maximul de pana acum, actualizez maximul

Pun functia de calculare:
Cod:
void rezolvare()
{
int i,j,p,q;
p=1; q=0; //initial coada este goala
for(i=1;i<=n;i++)
{
while(p<=q&&v[d[q]]<=v[i]) q--; //cat timp am varsta mai mare de adaugat
d[++q]=i; //il punem in deque
if(i-d[p]>k) p++; //dispare primul element
j=v[d[p]]-v[i]; //diferenta dintre cel mai batran solarian din interval, si solarianul curent
if(j>vmax) vmax=j; //am gasit o diferenta mai mare
}
}

LE: Am descoperit ce greseam....am facut cu doua deque-uri (unul pt minim, si altul pentru maxim) si am luat 100  Yahoo!
« Ultima modificare: Martie 10, 2009, 20:24:12 de către Cosmin Mihai Tutunaru » Memorat
mihaionly
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #7 : Martie 09, 2010, 17:48:12 »

A făcut cineva problema asta folosind un singur deque? Eu a trebuit să implementez două (maxim și minim) pentru că algoritmul descris în soluție nu a fost bun pe toate cazurile.
Dacă de exemplu, avem 1 2 3 4 7 și k=3, deque-ul îl va exclude pe 3 când dă de 4 iar când ajung la 7 nu pot decât să-l compar cu 4, maximul ieșind 3 când defapt este 4   Confused
Memorat
dornescuvlad
Nu mai tace
*****

Karma: -138
Deconectat Deconectat

Mesaje: 234



Vezi Profilul
« Răspunde #8 : Aprilie 17, 2010, 12:38:36 »

Ce ar putea fi gresit in abordarea aceasta ?

Cod:
	FirstMax = 1, LastMax = 0; // DequeMax e goala
FirstMin = 1, LastMin = 0; // DequeMin e goala

for(i = 1; i <= N; i ++)
{
while(Values[i] >= Values[DequeMax[LastMax]] && LastMax >= FirstMax) LastMax --;
DequeMax[++ LastMax] = i;
if(abs(i - DequeMax[FirstMax]) > K) // conditia de vecini
FirstMax ++;

while(Values[i] <= Values[DequeMin[LastMin]] && LastMin >= FirstMin) LastMin --;
DequeMin[++ LastMin] = i;
if(abs(i - DequeMin[FirstMin]) > K) // conditia de vecini
FirstMin ++;

if(Values[DequeMax[FirstMax]] - Values[DequeMin[FirstMin]] > maxim)
maxim = Values[DequeMax[FirstMax]] - Values[DequeMin[FirstMin]]; //cel mai mare element din secventa - cel mai mic element din secventa
}

DequeMax - deque pentru maximul dintr-o secventa
DequeMin - deque pentru minimul dintr-o secventa
« Ultima modificare: Aprilie 17, 2010, 12:49:17 de către Dornescu Vlad-Eugen » Memorat
best4him
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #9 : Octombrie 26, 2010, 21:00:32 »

Cod:
#include <fstream>
#include <cstdlib>
using namespace std;
 
ifstream fin("vila2.in");
ofstream fout("vila2.out");

int n,k,front,back,i,maxim,front1,back1;
int a[100010],d[100010],d1[100010];
 
int main()
{
maxim=-30001;
    
    fin>>n>>k;
    for(i=1;i<=n;i++){
        fin>>a[i];
    }
    
    front=1,back=0;
front1=1,back1=0;
    
    for(i=1;i<=n;i++){
        
        while(front<=back && a[i]>=a[d[back]])
            back--;
d[++back]=i;
while(front1<=back1 && a[i]<=a[d1[back1]] )
            back1--;
d1[++back1]=i;

       if(i>=k &&  a[d[front]]-a[d1[front1]]>maxim && abs(d[back]-d1[back1])<=k){
            maxim=a[d[front]]-a[d1[front1]];
        }
       if(d[front] == i-k)
           front++;
  if(d[front1] == i-k)
           front1++;
   }
    
   fout<<maxim;
    
  return 0;
}


nu iau un test...testul 4...imi puteti spune ce gresesc? Multumesc!
am rezolvat pana la urma  Fool Embarassed

[editat de moderator] foloseste tag-ul "code" cand postezi cod pe forum!
« Ultima modificare: Octombrie 28, 2010, 13:18:45 de către Cristinescu Andrei » Memorat
AlexandruValeanu
Vorbaret
****

Karma: 29
Deconectat Deconectat

Mesaje: 167



Vezi Profilul
« Răspunde #10 : Februarie 02, 2013, 19:47:53 »

Imi poate spune si mie cineva cu gresesc sau un hint despre rezolvare?
Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« Răspunde #11 : Februarie 03, 2013, 00:36:44 »

In general cand vrei sa iti spuna lumea ce gresesti ar fi util sa descri ce faci in sursa ta pentru ca este mult mai incomod de interpretat o sursa decat o idee.
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #12 : Februarie 03, 2013, 17:00:03 »

Tocmai ti s-a spus mai sus ca mai bine sa descrii algoritmul decat sa postezi sursa  wink

Nu iei in considerare cazul in care e un locuitor cu varsta mare dupa care unul cu varsta mica. Indiciu: iti trebuie doua deque.
Memorat
Djok
Client obisnuit
**

Karma: 10
Deconectat Deconectat

Mesaje: 71



Vezi Profilul
« Răspunde #13 : Februarie 16, 2014, 10:45:27 »

Pentru testul exemplu, nu ar trebui sa fie raspunsul 5?
sau k=3?
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines