infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din Martie 30, 2007, 20:56:42



Titlul: 394 Vila 2
Scris de: Adrian Diaconu din Martie 30, 2007, 20:56:42
Aici puteţi discuta despre problema Vila 2 (http://infoarena.ro/problema/vila2).


Titlul: Răspuns: 394 Vila 2
Scris de: Ionescu Vlad din 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  :oops:


Titlul: Răspuns: 394 Vila 2
Scris de: Andrei Homorodean din 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.


Titlul: Răspuns: 394 Vila 2
Scris de: Paul-Dan Baltescu din 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  :oops:

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. 


Titlul: Răspuns: 394 Vila 2
Scris de: Ionescu Vlad din Septembrie 01, 2007, 14:02:16
Va multumesc la amandoi, mi-a iesit pana la urma :)


Titlul: Răspuns: 394 Vila 2
Scris de: Alex Mircescu din 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' 

... :-s

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

LLE: Am uitat sa spun ca mi-o iesit  :D


Titlul: Răspuns: 394 Vila 2
Scris de: Cosmin-Mihai Tutunaru din Martie 10, 2009, 19:05:56
Am icnercat si eu o rezolvare la problema asta.
Si din pacate iau doar 60 pct  ](*,)

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:


Titlul: Răspuns: 394 Vila 2
Scris de: Mihai Jiplea din 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   :?


Titlul: Răspuns: 394 Vila 2
Scris de: Vlad Eugen Dornescu din 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


Titlul: Răspuns: 394 Vila 2
Scris de: GIgi ion din 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: :oops:

[editat de moderator] foloseste tag-ul "code" cand postezi cod pe forum!


Titlul: Răspuns: 394 Vila 2
Scris de: Alexandru Valeanu din Februarie 02, 2013, 19:47:53
Imi poate spune si mie cineva cu gresesc sau un hint despre rezolvare?


Titlul: Răspuns: 394 Vila 2
Scris de: Radu-Andrei Szasz din 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.


Titlul: Răspuns: 394 Vila 2
Scris de: George Marcus din 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.


Titlul: Răspuns: 394 Vila 2
Scris de: Valeriu Motroi din Februarie 16, 2014, 10:45:27
Pentru testul exemplu, nu ar trebui sa fie raspunsul 5?
sau k=3?