Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Probleme la convertirea din unsigned int in int  (Citit de 1298 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
APOCALYPTO
Nu mai tace
*****

Karma: 3
Deconectat Deconectat

Mesaje: 250



Vezi Profilul
« : 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!
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #1 : 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++;
Memorat
APOCALYPTO
Nu mai tace
*****

Karma: 3
Deconectat Deconectat

Mesaje: 250



Vezi Profilul
« Răspunde #2 : 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  Confused.
Sa fie de la linia cu
Cod:
while(yo>p[left])
Think ?
Adica sa nu am voie cu yo int si p[ left ] unsigned int?


« Ultima modificare: Septembrie 05, 2010, 21:44:58 de către Dragos » Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #3 : Septembrie 06, 2010, 10:37:06 »

Incearca asa :
Cod:
while( ( unsigned ) yo > p[left] )
sau
while( yo > ( int ) p[left] )
Memorat
blasterz
Nu mai tace
*****

Karma: 92
Deconectat Deconectat

Mesaje: 255



Vezi Profilul
« Răspunde #4 : Septembrie 06, 2010, 10:44:51 »

sau asa

Cod:

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

Memorat
APOCALYPTO
Nu mai tace
*****

Karma: 3
Deconectat Deconectat

Mesaje: 250



Vezi Profilul
« Răspunde #5 : 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.
« Ultima modificare: Septembrie 06, 2010, 16:03:44 de către Dragos » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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