Afişează mesaje
|
|
Pagini: [1]
|
|
1
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 023 Numere Prime
|
: Aprilie 05, 2009, 22:06:36
|
Este o diferenta intre MinGW si g++ la afisarea numerelor long long. Pe g++ se foloseste %lld; pe MinGW, I64d. Cum pe infoarena se compileaza cu g++, iata de ce iei bine aici si gresit la tine cand afisezi cu lld.
Fstream se descurca la fel si pe MinGW si pe g++ si de-aia e ok in ambele parti.
multumesc pentru clarificare  asta inseamna ca e cazul sa-mi schimb compilatorul cu unul mai asemanator cu g++?
|
|
|
|
|
3
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 023 Numere Prime
|
: Aprilie 05, 2009, 21:50:04
|
 am luat suta cu fstream. as fi recunoscator daca mi-ar explica cineva de ce. nu folosesc borland, folosesc mingw studio. din cate am inteles ar trebui sa se comporte la fel cu compilatorul de pe infoarena. [Edit] foarte foarte aiurea... cu "%I64d" ala iau doar 50.. [Later edit] eu nu mai inteleg absolut nimic.. deci cu fstream e ok si la mine si pe site, dar mi-e mie incomod. cu stdio imi da mie bine daca folosesc "%I64d", dar da gresit pe site. daca folosesc "%lld", imi da gresit pe compilatorul meu, dar corect in evaluator. e aiurea rau de tot 
|
|
|
|
|
4
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 023 Numere Prime
|
: Aprilie 05, 2009, 21:42:22
|
ajutati-ma si pe mine, va rog frumos. am o problema foarte dubioasa. am facut problema, merge corect si pe testul cu 100.000, dar imi afiseaza gresit  stiu sigur ca algoritmul e bun, pentru ca in debug imi apare valoarea corecta, dar in fisierul de iesire e o aberatie. mai precis, am codul urmator: #include <stdio.h> #define N 1318700
bool prim[N]; long long x; int count,k;
int main() { freopen("prim.in","r",stdin); freopen("prim.out","w",stdout); scanf("%d",&k); [...] for(...) if(...) { x=i*i; printf("%lld",x); break; } } fclose(stdin); fclose(stdout); return 0; }
exact asta fac. e foarte dubios, pentru ca daca dau 100000, in debug imi arata x ca fiind 1.689.274.677.841, iar in fisierul de iesire, in urma instructiunii printf("%lld",x) imi afiseaza 1.352.530.513. ce gresesc? 
|
|
|
|
|
6
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 683 Piata
|
: Martie 16, 2009, 12:54:57
|
ma poate ajuta cineva?  iau WA pe testul 9, chiar nu inteleg de ce, si mi-e un pic cam greu sa fac debug pe un test de 40 000  fac cam asa: scanf("%d%d%d%d%d",&n,&y1,&x1,&y2,&x2); for(int i=1;i<=n;i++) v[i]=f(i); while(y1>1) //duc dreptunghiul cu suma pe prima linie { x1--; x2--; y1--; y2--; } for(int i=x1;i<=x2;i++) s+=elem(i); suma=s; for(int i=1;i<y2;i++) { s-=elem(x2); s+=elem(x1-1); suma+=s; x1--; x2--; } printf("%ld",suma);
unde elem(i) e o functie care returneaza v[ i ] daca i e in limita vectorului (1->n) sau corespondentul lui i in vector, daca e in afara limitelor inline int elem(int x) { int t; if(x>0&&x<=n) //e clasic return v[x]; else { if(x<=0) { while(x<=0) { t=1-x; x=n-t+1; } return v[x]; } else { while(x>n) { t=x-n; x=t; } return v[x]; } } }
|
|
|
|
|
9
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 444 Politic
|
: Martie 02, 2009, 01:47:43
|
Am incercat sa re-rezolv problema asta folosind cautarea binara. Brusc nu mai inteleg problema nici cu rezolvarile anterioare. Sunt total confuz  Imi explica si mie cineva exemplul? De unde sunt doar 4 coalitii posibile?! Programul meu afiseaza 7, ceea ce mi se pare si foarte logic. Partidul 1 se poate asocia cu 2, cu 3, cu 4 si cu 5. Partidul 2 se asociaza cu 4 si 5. Partidul 3 cu 5. Partidul 4 nu se asociaza cu nimeni.. In total 4+2+1=7... Am folosit cautarea binara ca sa aflu nr minim de partide dintr-o coalitie.
|
|
|
|
|
10
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 168 Numarare triunghiuri
|
: Martie 01, 2009, 22:04:40
|
Ce optimizare?
in al 3lea for, nu parcurgi vectorul pana la capat, ci pana gasesti prima valoare care nu mai respecta conditia v[ i ]+v[ j ]<=v[ k ]. pentru ca ai sortat dinainte vectorul, conditia va fi falsa si pentru toate valorile de dupa acest k. in practica folosesti un mic break. sper ca am fost clar  [L.E.] Cred ca ar putea fi modificate testele astfel incat sa descurajeze folosirea smecheriei asteia  adica conditia de care ziceam sa devina falsa spre sfarsitul vectorului, astfel incat sa nu mai conteze foarte mult la timp break-ul ala.
|
|
|
|
|
14
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 685 Pluricex
|
: Aprilie 02, 2008, 17:16:00
|
Eu am asemenea functie de verificare //vectorul elev[23] reprezinta stiva, apar[23] reprezinta aparitiile disciplinelor in cadrul unei combinari //matricea stie[23][10] ia valoarea 1 daca elevul i stie disciplina j si 0 altfel
inline int bun() { int i,j;
for(i=0;i<k;i++) for(j=1;j<=d;j++) if(stie[elev[i]][j]) apar[j]++; for(i=1;i<=d;i++) { if(!apar[i]) { for(j=i;j<=d;j++) apar[j]=0; //reinitializez pentru combinarea urmatoare return 0; } apar[i]=0; } return 1; }
void back(int x) { if(k==x) { if(bun()) { for(int i=0;i<k;i++) printf("%d ",elev[i]); printf("\n"); } } else for(int i=elev[x-1]+1;i<=n;i++) { elev[x]=i; back(x+1); } }
totusi nu obtin decat 80 de puncte... ce anume sa optimizez? 
|
|
|
|
|
15
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva educationala / Răspuns: 017 Combinari
|
: Martie 15, 2008, 22:23:45
|
Am vazut ca in sursa ta tot faci verificarea asta: for(int j=1;j<i;j++) if (x[j+1]<=x[j]) return 0; return 1;
Gandeste-te ca poti sa generezi permutarile direct, corect, fara verificare. Exemplu daca ai deja generat : 1 3 5 atunci urmatorul element il vei alege ca fiind mai mare decat 5, nu le mai incerci si pe alea mai mici sau egale decat 5 pentru ca sigur nu vor fi bune. Analizeaza si alte surse, ca sa vezi diferite implementari. daca stiam chestia asta inainte de oji luam 130 de puncte si poate aveam si eu sanse... oricum buna sugestie 
|
|
|
|
|