infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Dragos din Septembrie 04, 2010, 22:30:29



Titlul: Probleme la convertirea din unsigned int in int
Scris de: Dragos din Septembrie 04, 2010, 22:30:29
Salut!
Am avut recent niste dificultati la una din problemele din arhiva in care era nevoie de putine optimizari pentru a obtine 100 de puncte.
Cod:
 


     yo=(int)p[ii]-D;
     while(yo>p[left])
     left++;
     pu=p[ii]+D;
     while(pu>=p[right]&&right<=N)
      right++;



P[] este unsigned int, D este int, yo este int,pu este int.
Fragmentul de mai sus nu merge(ia 0 puncte) desi se garanteaza ca p[ii] si D <(1<<31) )
In schimb declar yo ca fiind long long si fac si conversia in long long iau 95(pe pu il las int):
Cod:
     
     yo=(long long)p[ii]-D;
     while(yo>p[left])
     left++;
     pu=p[ii]+D;
     while(pu>=p[right]&&right<=N)
      right++;
Iar daca declar vectorul int si las yo ca int iau 100.

Vreau sa stiu in primul rand cum as putea sa fac conversia la prima bucata de cod ca sa nu mai am probleme pe viitor.

 Tinand cont ca iau 0 puncte e clar ca doar conversia e gresita pentru ca nici pe cazuri simple nu da bine.

Multumesc anticipat pentru raspunsuri!


Titlul: Răspuns: Probleme la convertirea din unsigned int in int
Scris de: Pripoae Teodor Anton din Septembrie 05, 2010, 17:15:29
Cod:
yo=(int)(p[ii]-D);
while(yo>p[left])
left++;
pu=p[ii]+D;
while(pu>=p[right]&&right<=N)
right++;


Titlul: Răspuns: Probleme la convertirea din unsigned int in int
Scris de: Dragos din Septembrie 05, 2010, 21:38:39
Cod:
yo=(int)(p[ii]-D);
while(yo>p[left])
left++;
pu=p[ii]+D;
while(pu>=p[right]&&right<=N)
right++;
Nu are efect din pacate  :?.
Sa fie de la linia cu
Cod:
while(yo>p[left])
:-k ?
Adica sa nu am voie cu yo int si p[ left ] unsigned int?




Titlul: Răspuns: Probleme la convertirea din unsigned int in int
Scris de: Simoiu Robert din Septembrie 06, 2010, 10:37:06
Incearca asa :
Cod:
while( ( unsigned ) yo > p[left] )
sau
while( yo > ( int ) p[left] )


Titlul: Răspuns: Probleme la convertirea din unsigned int in int
Scris de: Mircea Dima din Septembrie 06, 2010, 10:44:51
sau asa

Cod:

while ( static_cast <unsigned> (yo) > p[left] )



Titlul: Răspuns: Probleme la convertirea din unsigned int in int
Scris de: Dragos din Septembrie 06, 2010, 15:50:24
Incearca asa :
Cod:
while( ( unsigned ) yo > p[left] )
sau
while( yo > ( int ) p[left] )
A doua varianta e buna. Ia 100 desi e oarecum de asteptat.

Thanks & +.

Prima nu merge.
Citat
sau asa

Cod:

while ( static_cast <unsigned> (yo) > p[left] )

Merge decat daca mai pun un if:
Cod:
yo=(int)p[ii]-D;
     if(yo<0)
     yo=0;
     while ( static_cast <unsigned> (yo) > p[left] )
     left++;

Thanks & + also.

LE:Se pare ca si prima a lui Robert functioneaza cu  if-ul respectiv.