infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Andrei Grigorean din Decembrie 13, 2010, 00:37:03



Titlul: 1091 Kbiti
Scris de: Andrei Grigorean din Decembrie 13, 2010, 00:37:03
Aici puteti discuta despre problema Kbiti (http://infoarena.ro/problema/kbiti).


Titlul: Răspuns: 1091 Kbiti
Scris de: Farcas Ionut din Decembrie 13, 2010, 15:20:38
80 de pct...nasol la ultimele 2 teste imi da eroare la timp


Titlul: Răspuns: 1091 Kbiti
Scris de: Vlad Eugen Dornescu din Decembrie 13, 2010, 16:01:47
80 de pct...nasol la ultimele 2 teste imi da eroare la timp

Incearca sa schimbi citirea.Foloseste gets(S) pentru a citi o linie (un sir de biti de lungime L).


Titlul: Răspuns: 1091 Kbiti
Scris de: Eugenie Daniel Posdarascu din Decembrie 20, 2010, 16:10:57
Foloseste urmatoarea citire:

scanf("%s",s);

E cea mai rapida citire care o stiu dar nu trebuie folosita mereu. In cazul in care ai spatii sau lungimea sirului depaseste 30 000 (sau asa ceva) e indicat sa nu o folosesti. In cazul acestei probleme ar trebui sa mearga.

Multa bafta.


Titlul: Răspuns: 1091 Kbiti
Scris de: Simoiu Robert din Decembrie 20, 2010, 17:08:49
Pot sa te contrazic, fgets e mult mai rapid, eu am citit cu scanf, am avut 90 pct. iar cu fgets am luat 100 lejer. Cand volumul de date este mare, fgets face diferenta ;).


Titlul: Răspuns: 1091 Kbiti
Scris de: Alexandru Gherghe din Decembrie 29, 2010, 22:51:24
Puteti va rog sa ma ajutati sa-mi spuneti ce anume este gresit in sursa mea? Iau 90p si chiar nu inteleg unde este greseala...
Cod:
#include<cstdio>
#include<cstring>

using namespace std;

int main() {
freopen("kbiti.in","r",stdin);
freopen("kbiti.out","w",stdout);

char sir[32];
int T, i, j;
long long int sol;

scanf("%d\n",&T);
while(T--) {
scanf("%s",sir);
for(sol=0, i=strlen(sir)-1, j=0; i>=0; i--, j++)
sol+=(long long int)(sir[i]-'0')*(long long int)(1<<j);
printf("%lld\n",++sol);
}

return 0;
}




Titlul: Răspuns: 1091 Kbiti
Scris de: Dragos-Alin Rotaru din Decembrie 29, 2010, 23:27:04
Declara char sir [33] apoi inlocuieste
Cod:
sol+=(long long int)(sir[i]-'0')*(long long int)(1<<j);
cu asta
Cod:
sol+=(sir[i]-'0')*(1LL<<j);
si o sa ai 100 :)


Titlul: Răspuns: 1091 Kbiti
Scris de: Alexandru Gherghe din Decembrie 30, 2010, 02:00:06
mersi, acum merge. dar nu inteleg, ce face exact instructiunea asta "1LL" si practic de ce nu merge cum faceam eu?


Titlul: Răspuns: 1091 Kbiti
Scris de: Sima Cotizo din Decembrie 30, 2010, 07:42:24
"1LL" este numarul 1 de tip long long. La cum faceai tu, intai se efectua shift si dupa conversia catre long long: practic rezultatul shiftarii ramanea int pana la conversie, de unde si rezultatul eronat. Cred ca ar fi mers si:
Cod:
(((long long)1) << j)


Titlul: Răspuns: 1091 Kbiti
Scris de: Alexandru Gherghe din Decembrie 30, 2010, 11:33:35
aha, am inteles. multumesc mult de ajutor:)


Titlul: Răspuns: 1091 Kbiti
Scris de: Simoiu Robert din Ianuarie 20, 2011, 10:30:34
Un sfat pentru cei din Pascal, ca sa luati 100 pct. Folositi SetTextBuf (http://www.freepascal.org/docs-html/rtl/system/settextbuf.html) :
Cod:
 var Bufin : array[1 .. 1 shl 17] of char;
    Bufou : array[1 .. 1 shl 17] of char;
         
          begin
              .............
              SetTextBuf ( fisierin, Bufin ) ;
              SetTextBuf ( fisierout, Bufou ) ;
          end .


Titlul: Răspuns: 1091 Kbiti
Scris de: Nicu B. din Mai 08, 2012, 17:51:28
Eu am luat 100 cu un vector de puteri de la 2^1 pana la 2^32 (poate ajuta pe cineva).


Titlul: Răspuns: 1091 Kbiti
Scris de: Petru Trimbitas din Mai 08, 2012, 18:48:52
Tie nu ti-a intrat din cauza ca ai folosit pow. Fa si tu operatii pe biti sau baga exponentiere in timp logaritmic. http://infoarena.ro/problema/lgput (http://infoarena.ro/problema/lgput) ;)


Titlul: Răspuns: 1091 Kbiti
Scris de: Oncescu Costin din Mai 08, 2012, 19:45:42
Eu iau 90 si nu inteleg de ce.Ma poate ajuta si pe mine cineva?
Cod:
gets(a+1);
m=strlen(a+1);
p=0;
for(j=1;j<=m;j++)
if(a[j]=='1') p=(unsigned long long)p+(1<<(m-j));
printf("%lld\n",p+1);

Edit: cand postezi cod in mesaje pe forum trebuie sa folosesti tag-ul code


Titlul: Răspuns: 1091 Kbiti
Scris de: Mihai-Alexandru Dusmanu din Mai 08, 2012, 20:22:15
Incearca sa faci cum e scris mai jos ;). S-ar putea sa mearga. Cred ca la tine se buseste daca faci (1 << 31).
Cod:
(1LL << (m - j))


Titlul: Răspuns: 1091 Kbiti
Scris de: Oncescu Costin din Mai 13, 2012, 14:58:05
Ms asta era greseala am luat 100 :yahoo:


Titlul: Răspuns: 1091 Kbiti
Scris de: Campeanu Vlad din Octombrie 01, 2012, 21:58:43
Nu prea are legatura cu problema ci cu cast-ul. Nu inteleg de ce nu merge sa faci asa:
Cod:
long long sol = 0;
sol += 1 << 31;

Pentru ca 1 << 31 nu incape pe int ci maxim (1 << 31) - 1 ?

Daca as avea
Cod:
long long sum;
int a = b = (1 << 31) - 1;
sum = a + b;
Merge direct sau tre sa fac cast si sa scriu sum =  1LL * a + b pentru ca (a + b) depaseste tipul lor de date(int) ?