infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Dan-Leonard Crestez din Aprilie 01, 2004, 00:33:16



Titlul: 027 Loto
Scris de: Dan-Leonard Crestez din Aprilie 01, 2004, 00:33:16
Aici puteţi discuta despre problema Loto (http://infoarena.ro/problema/loto).


Titlul: 027 Loto
Scris de: Manolache Adrian din Martie 14, 2005, 11:23:44
Am trimis 3 variante de solutii la problemea dupa cum urmeaza:
   1. Backtracking si primesc OK pe 5,6, TLE pe ultimele trei teste si WA in rest
    2. Solutia cu 6 for-uri si primesc WA pe 1..4 OK pe 5 si TLE in rest
    3. Solutia cu cautare binara si primesc OK pe 5,6 si WA in rest

Acuma cred ca nu mi-a m-ai ramas decat sa-mi iau lumea in cap si sa plec de acasa, asta daca nu binevoieste  :twisted:  cineva sa-mi dea vreun test
sa vad si eu unde gresesc.


Titlul: 027 Loto
Scris de: Marin Radu din Martie 14, 2005, 12:24:48
Belea..daca nici solutia de N^6 n-o scrii corect?..nu cred ca o s-o faci prea curand. Trebuie sa te apuci serios de DEBUG... :lol:

uite aici o solutie N^6 corecta
compar-o cu a ta si vezi "diferenta"

Cod:

#include<stdio.h>
#define MAXN 101

FILE *in=fopen("loto.in","r"),*out=fopen("loto.out","w");
int N,S,V[MAXN];

void citesteDate()
{int i;
  fscanf(in,"%d %d",&N,&S);
  for(i=1;i<=N;i++)
     fscanf(in,"%d",&V[i]);
  fclose(in);
}

void proceseaza()
{int i,j,k,l,m,n;
  for(i=1;i<=N;i++)
      for(j=1;j<=N;j++)
         for(k=1;k<=N;k++)
             for(l=1;l<=N;l++)
                 for(m=1;m<=N;m++)
                     for(n=1;n<=N;n++)
                        if (V[i]+V[j]+V[k]+V[l]+V[m]+V[n]==S)
                           {fprintf(out,"%d %d %d %d %d %d\n",V[i],V[j],V[k],V[l],V[m],V[n]);
fclose(out);
return;}
 fprintf(out,"-1\n");
 fclose(out);
}

                   

 

int main()
{
 citesteDate();
 proceseaza();
 return 0;
}


Iei pe ea exact 35p daca o copiezi corect. :P  

Bafta la cautare N^3 * log(N^3)!

[edited by svalentin] foloseste [*code*][*/code*] (fara *) pentru a formata o sursa corect


Titlul: 027 Loto
Scris de: Tiberiu-Lucian Florea din Martie 14, 2005, 12:40:55
Sau n^3.


Titlul: 027 Loto
Scris de: Manolache Adrian din Martie 14, 2005, 12:52:40
dupa ce nu dormi 48 de ore ajungi sa nu mai vezi bine...


Titlul: 027 Loto
Scris de: Rus Cristian din Martie 14, 2005, 15:01:32
Eu am facut cu un back recursiv optimizat si am luat 70 de puncte dar totusi nu cred ca se rezolva cu back pentru ca sunt prea mari datele...dar daca faci cu un back destul de bun..faci peste 60 de pct...


Titlul: 027 Loto
Scris de: Manolache Adrian din Martie 14, 2005, 16:00:56
incearca back in heap poti sa iei 85+


Titlul: 027 Loto
Scris de: Giurgea Mihnea din Martie 14, 2005, 17:06:48
Din cate tin eu minte, am rezolvat problema f. usor: n^3 log (n^3), cu o cautare binara. Cred ca ar trebui sa fie usor acum...


Titlul: 027 Loto
Scris de: Dima Alex din Martie 14, 2005, 22:12:17
Eu am facut N^3 * T, unde T ii timpu pt operatii cu mapurile din stl :P .


Titlul: 027 Loto
Scris de: Marin Radu din Martie 15, 2005, 08:04:26
greco: si cati MB ai folosit pt. N^3. As presupune ca 37.5...nu :?: ...la ONI trebuie sa te incadrezi in 15, deci e numai buna in N^3*log(N^3). :wink:


Titlul: 027 Loto
Scris de: Tiberiu-Lucian Florea din Martie 15, 2005, 19:18:47
#define vmax 1000001

int n, m, s, lg, w[wmax], v[vmax][3], sol1, sol2, found;

--------------------

De fapt, daca ma gandesc mai bine (am facut de ceva timp problema) din 2 pasi de n^3 log n numai unul l-am redus la n^3.  :mrgreen:
Imi cer scuze pentru inconvenientele cauzate.  :oops:


Titlul: 027 Loto
Scris de: Marin Radu din Martie 16, 2005, 08:56:35
Se mai intampla...
 :D Se poate si in N^3 da cum ziceam mananca multa memorie...


Titlul: 027 Loto
Scris de: cristi8 din Aprilie 01, 2005, 22:17:38
imi explica si mie cineva cum se face cautarea aia binara ?

..eu am facut problema cu 3 hash-table-uri... suma care se poate obtine cu 1,2 sau 3 numere..
..si dupa aia am facut n^3 pt primele 3 numere si am cautat restul sumei in ultimul hash..


Titlul: 027 Loto
Scris de: Voicu Octavian din Aprilie 03, 2005, 13:03:22
Eu am facut un vector pt toate sumele posibile de 3 numere din fisierul de intrare... si apoi sortez vectorul asta si il parcurg de la inceput si pt fiecare suma fac cautare binare pt S-suma. Daca exista atunci reconstitui nr cu care s-a obtinut suma si S-suma. Trebuie ceva optimizari pt ultimele teste.


Titlul: 027 Loto
Scris de: Cont de teste din August 02, 2005, 23:41:46
Citat din mesajul lui: druid
Eu am facut un vector pt toate sumele posibile de 3 numere din fisierul de intrare... si apoi sortez vectorul asta si il parcurg de la inceput si pt fiecare suma fac cautare binare pt S-suma. Daca exista atunci reconstitui nr cu care s-a obtinut suma si S-suma. Trebuie ceva optimizari pt ultimele teste.


Am facut exact ca si tine si pe ultimele 4 teste iau timp depasit.
Ce optimizari ai facut?
Eu am ordonat cu quick sort am facut cautare binara si totusi am timp depasit.
 ](*,)


Titlul: 027 Loto
Scris de: u-92 din August 03, 2005, 07:57:38
eu tot qsort+cautare binara am folosit si mi s-a incadrat f. bine in timp.. poate nu te opresti cand gasesti solutie.. nustiu de la ce altceva ar putea fi


Titlul: 027 Loto
Scris de: Cont de teste din August 03, 2005, 16:31:43
Citat din mesajul lui: u-92
eu tot qsort+cautare binara am folosit si mi s-a incadrat f. bine in timp.. poate nu te opresti cand gasesti solutie.. nustiu de la ce altceva ar putea fi


ma opresc, fac tot asa cum ai zis tu si totusi ... :oops:


Titlul: 027 Loto
Scris de: vladut.forum din August 03, 2005, 16:46:05
mah daca nimik altceva nu poate fii...atunci
nu faci bine cautarea binara
vezi cand intializezi left sa cresti cu unu
si cand initializezi right sa scazi cu unu
deci verifica sa fie
while (left<=right) {

tra la la
if (conditie1) {solutie; ma opresc;}
if (conditie2) left=(left+right)/2+1;
else right = (left+right)/2-1;
}
ceva imi spune ca sigur e asta
verifica si spunemi


Titlul: 027 Loto
Scris de: Oltean Dorin din August 04, 2005, 16:51:19
la completarea vectorului cu sumele de trei numere, pana unde trebuie completat???:-k
eu cred ca din cauza aia iau TLE la unele teste  :lol:


Titlul: 027 Loto
Scris de: VladS din August 04, 2005, 16:59:03
Pana la capat (N^3 numere). Nu de aici iei TLE.


Titlul: 027 Loto
Scris de: Oltean Dorin din August 04, 2005, 17:08:04
Ok atunci e de la alteceva shi o sa mai optimizez poate intr-un final  iau shi eu 100 p.  :mrgreen:


Titlul: 027 Loto
Scris de: Oltean Dorin din August 07, 2005, 22:38:04
iau 95 de p WA testul unu  nu avetzi vreo idee de ce nu merge :?:

pe alte rezolvari luam punctaj pe testul 1 ce ar pute sa aiba
???


Titlul: 027 Loto
Scris de: Bogdan-Cristian Tataroiu din August 08, 2005, 10:42:48
Fa-ti un generator de teste si verifica ce da programul tau cu solutia N^6. O sa-ti foloseasca si la alte probleme de pe infoarena si in concursuri.


Titlul: 027 Loto
Scris de: Oltean Dorin din August 08, 2005, 14:45:33
e o idee buna dar numerele cum le aleg ?? random sau crescator  ?? :-k
ca la suma nu e greu  :D


Titlul: 027 Loto
Scris de: Bogdan-Cristian Tataroiu din August 08, 2005, 14:57:34
In general eu fac 100 teste random (stiu ca e cam exagerat, dar ... :) ) Fa-le cat de cat mici sa poti face debug dupa aia


Titlul: 027 Loto
Scris de: Schneider Stefan din August 08, 2005, 16:52:26
poti sa faci 90 de puncte si cu 6 for-uri


Titlul: 027 Loto
Scris de: Oltean Dorin din August 08, 2005, 18:35:24
Citat
poti sa faci 90 de puncte si cu 6 for-uri

cum ai facut cu 6 foruri 90 p ???
ai parcurs siru de la sfarsit la inceput


Titlul: 027 Loto
Scris de: Oltean Dorin din August 08, 2005, 19:48:44
mersi bogdan2412 pentru idee am facut shi asha dar din cate exemple am dat nici unul nu e gresit
este insa o diferenta cu sase foruri da alte numere dar suma este aceeasi
are vreo importanta ?????

----------------------------------
cine poate sa imi dea un test asemanator cu testul unu sa vedem ce e gresit?
poate fac shi eu de 100 #-o


Titlul: 027 Loto
Scris de: Schneider Stefan din August 08, 2005, 23:02:52
exact, il parcurgi de la sf la inceput pt ca il scutesti sa mai incarce variabila "n" in memorie.
daca sortezi siru' o sa primesti 95 puncte


Titlul: 027 Loto
Scris de: andreit1 din August 09, 2005, 10:38:46
Eu a luat 100 cu un O(N^6). Am sortat vectorul si dupa aceea am verificat la fiecare pas sa se poate obtine suma cu numerele ramase


Titlul: 027 Loto
Scris de: Liviu Ciortea din Septembrie 07, 2005, 17:17:48
Se poate si O(N^3), iar implementand cu set din stl, implementarea iese in cateva randuri...
Dupa sortarea sumelor, pornesti de la fiecare capat (deci un indice este 0 si celalalt n-1) si, daca suma curenta (adica suma celor doua elemente unde ai pozitionati indicii in acel moment) e corecta, te opresti, daca e mai mica cresti indicele mic, iar daca e mai mare scazi indicele mare...


Titlul: 027 Loto
Scris de: nivan din Noiembrie 09, 2005, 19:06:49
Mei oameni buni.....
  Eu am facut problema asta in doua moduri:
    1) Backtracking  ----------------> pe care primesc 20 puncte
    2) Backtracking  optimizat -----> pe care primesc 40 puncte
    3) O(n^3) -----------------------> pe care primesc 90 puncte shi TLE la penultimele doua teste

  Este ciudat cum O(n^6) poate lua acelasi punctaj cu O(n^3). Dar nu asta este problema ci daca puteti puteti sa-mi ziceti cate numere sunt la penultimul test ( Asa estimativ ~ ca sa vad cam ce ar mai trebui optimizat ca deja m-a scos din sarite aceasta problema  ](*,) )


Titlul: 027 Loto
Scris de: nivan din Noiembrie 09, 2005, 19:27:00
Shi cu O(n^6) tot 95 puncte iau !!!!!!  :oops:    Cred ca punctajul asta imi e predestinat  :rotfl:    
  Totusi poate sa-mi explice cel cu 100 la O(n^6) cum a facut astfel incat poate scot shi eu asa 100 puncte (Nu ca e mare diferenta de la 95 doar ca imi sta pe creier  ](*,) ).


Titlul: 027 Loto
Scris de: Valentin Stanciu din Noiembrie 21, 2005, 12:31:30
A mai rezolvat cineva problema asta dupa ce s-a schimbat calculatorul pe care era evaluatorul?!
Eu am rezolvat problema in N^3*logN; cu map din STL... si imi da TLE pe ultimile 3 teste.
(ma rog, si un WA pe primul.. :) )

de curiozitate: intre find din set si find din map e vre-o diferenta in termeni de complexitate?!


Titlul: 027 Loto
Scris de: Bogdan-Cristian Tataroiu din Noiembrie 21, 2005, 14:51:29
Am trimis din nou sursa cu care luam 100 si a intrat in timp fara probleme. 0.09 p testul cel mai mare...
Atat Set cat si Map sunt "Associative Container" si au ambele complexitate logaritmica la find() (daca am inteles bine eu).


Titlul: 027 Loto
Scris de: Valentin Stanciu din Noiembrie 21, 2005, 22:08:02
ok, mersi.

da, asa e, au aceeasi complexitate, dar despre constanta se poate spune ceva..?
o sa experimentez si cu hash_map, am inteles ca merge mai repede pentru cautari dupa key (neajunsul este ca nu sunt sortate.. dar la aceasta problema nu ne trebuie asta)

[later edit] ... se pare ca hash_map nu e chiar in standardul de C++ :)


Titlul: 027 Loto
Scris de: Ciocas Radu din Decembrie 24, 2005, 00:14:49
imi poate da cineva cateva sugestii la aceasta problema ? eu n-am reusit decat 25 p cu backtracking si cu 6 for-uri tot 25 parca am luat...
anyway ce-i ala stl ?
cele n numere din fisierul de intrare sunt in ordine crescatoare ?
(offtopic) backtracking recursiv are vreun avantaj fata de backtracking iterativ ? eu din cate stiam e cam tot acolo si l-am lasat balta
Sarbatori Fericite :)


Titlul: 027 Loto
Scris de: Bogdan-Cristian Tataroiu din Decembrie 24, 2005, 00:21:26
Daca citesti mai sus solutia e O(N ^ 3 log (N ^ 3)), folosind cautare binara... Ar trebui sa poti sa te prinzi cum o faci...  Despre STL exista un articol pe info.devnet.ro, dar ca sa-l folosesti ar fi bine sa cunosti bine limbajul C/C++.
Backtrackingul recursiv e mult mai scurt si mai simplu de implementat. Cel iterativ e putin mai rapid ca nu se fac apele recursive si nu se fac operatii pe stiva.


Titlul: 027 Loto
Scris de: Barca Cristian Mihai din Decembrie 30, 2005, 19:27:12
cum se face problema aceasta in O(n^6)....parcurgand sirul de la capat e acelasi lucru cu a-l parcurge de la inceput...nu e nici o diferenta si tot iese din timp :idea: nu am idee cum s-au luat 95 de puncte sau chiar 100 folosindu-se complexitatea asta


Titlul: 027 Loto
Scris de: Filip Cristian Buruiana din Decembrie 30, 2005, 19:56:58
Se sorteaza sirul intai si solutia se gaseste mult mai repede, desi complexitatea teoretica ramane O(N^6).


Titlul: Răspuns: 027 Loto
Scris de: Florian Marcu din Aprilie 13, 2007, 16:14:32
Am sortat sirul...l-am parcurs de la sfarsit spre inceput....(solutie O(n^6))..insa iau doar 40 de puncte...mi se pare imposibil sa se ajunga la 100 de puncte in felul asta...ciudat... ???


Titlul: Răspuns: 027 Loto
Scris de: Paul-Dan Baltescu din Aprilie 13, 2007, 21:56:23
Atunci incearca sa rezolvi problema intr-o complexitate mai buna. :)


Titlul: Răspuns: 027 Loto
Scris de: Florian Marcu din Aprilie 14, 2007, 13:49:59
Ai dreptate...voiam doar sa incerc faza cu O(n^6) k am citit pe forum k cik se pot lua 100 de puncte...ma kam indoiesc.. :thumbup:


Titlul: Răspuns: 027 Loto
Scris de: Ivan Nicolae din Aprilie 14, 2007, 17:47:04
 Problema se poate rezolva f usor in O(N^3 * log (N^3)).... cum s-a scris si mai sus. Dar am implementat si varianta cu O(N^6)... de curiozitate si luasem 90-95 pct fara nici o optimizare speciala. Binenteles ca de atunci pan' acuma probabil s-au modernizat testele.
 Pe vremea cand a mers faza, nici nu era infoarena 2 sa nu mai vb de optimizarea testelor.  :thumbup:


Titlul: Răspuns: 027 Loto
Scris de: nash mit din Aprilie 14, 2007, 21:25:54
 ok .. ma calca pe nervi .. acum nu imi merge testul 1 .. si la toate solutiile mai proste ( back .. si o(n^6) testul 1 .. merge .. :| .. nu vad cazul particular :| of .. frustrant  95p ...


Titlul: Răspuns: 027 Loto
Scris de: Codrea Marcel din Aprilie 14, 2007, 21:30:32
Din cate stiu , nu exista caz particular .... sigur ai gresit la implementare !
Gasesti aici o cautare binara implementata ca la carte , poate te ajuta :

http://infoarena.ro/Multe-smenuri-de-programare-in-CC-si-nu-numai

Sau poti sa alegi calea neortodoxa si pentru teste mici sa faci 0(n^6)....pentru teste mari O(N^3*log(N^3)) !


Titlul: Răspuns: 027 Loto
Scris de: Ivan Nicolae din Aprilie 14, 2007, 23:28:04
 Asta e o idee mai aiurea.... in regim de concurs nu stai sa implementezi 2 probleme in loc de 1 (mai alea cand una din ele e corecta). Nu exista cazuri particulare... sau cel putin nu existau.
 Vezi daca-ai facut cautarea binara bine.....


Titlul: Răspuns: 027 Loto
Scris de: nash mit din Aprilie 15, 2007, 08:39:41
Cod:
ok=1;
for(i=1;i<=nr && ok ;i++)
{
util=s-v[i].s;
ok=1;
a=1;
b=nr;
for(;a<b && ok;) {
mij=(a+b)/2;
if(v[mij].s==util) {
fout<<v[i].i<<" "<<v[i].j<<" "<<v[i].k<<" "<<v[mij].i<<" "<<v[mij].j<<" "<<v[mij].k;
ok=0;
}
if(v[mij].s>util) b=mij-1;
if(v[mij].s<util) a=mij+1;
}
}

if(ok) fout<<-1;
fout.close();

mie mi se pare destul de bine facuta cautarea asta binara :P ,sau .. nu e  :-k


Titlul: Răspuns: 027 Loto
Scris de: Ivan Nicolae din Aprilie 15, 2007, 10:36:17
 Intradevar pare sa fie ok..... ce iti da pe testul 1.... WA?


Titlul: Răspuns: 027 Loto
Scris de: nash mit din Aprilie 15, 2007, 10:59:26
Test     Timp executie     Memorie folosita     Mesaj    Punctaj/test
1   0ms   8kb   Wrong answer!   0
2   0ms   12kb   OK!   5
3   0ms   12kb   OK!   5
4   0ms   12kb   OK!   5
5   4ms   496kb   OK!   5
6   12ms   596kb   OK!   5
7   12ms   868kb   OK!   5
8   16ms   1084kb   OK!   5
9   20ms   1420kb   OK!   5
10   28ms   1784kb   OK!   5
11   36ms   2308kb   OK!   5
12   12ms   1092kb   OK!   5
13   112ms   4424kb   OK!   5
14   104ms   5364kb   OK!   5
15   172ms   6952kb   OK!   5
16   348ms   8664kb   OK!   5
17   344ms   11380kb   OK!   5
18   664ms   13728kb   OK!   5
19   376ms   15068kb   OK!   5
20   344ms   15728kb   OK!   5
Punctaj total   95


Titlul: Răspuns: 027 Loto
Scris de: Ivan Nicolae din Aprilie 15, 2007, 15:00:57
 S-ar putea sa nu fie de la cautarea binara... care pare corecta. Tu cand calculezi vectorul pe care cauti apoi binar cum faci? Sortezi ceva pacolo?


Titlul: Răspuns: 027 Loto
Scris de: nash mit din Aprilie 15, 2007, 19:27:28
da man ... foloses "sort" din stl ...  acolo chiar nu am cum sa gresesc :) ... sortez in functie de numarul format de cele 3 numere ... evident  :)


Titlul: Răspuns: 027 Loto
Scris de: Ivan Nicolae din Aprilie 15, 2007, 19:29:29
 Pai asta vroiam sa sugerez ca e mai bine sa sortezi decat sa bagi elementul direct unde trebuie in vector. (A doua varianta se poate gresi :) )


Titlul: Răspuns: 027 Loto
Scris de: Pandia Gheorghe din Aprilie 16, 2007, 21:40:14
Pt "nash". Si eu primeam "Wrong answer!" pe testul 1 deoarece calculam suma a 6 elemente pana la ultimele 6, in loc sa consider pana cand apare si ultimul element de 6 ori. Poate asta te ajuta  :wink:


Titlul: Răspuns: 027 Loto
Scris de: nash mit din Aprilie 17, 2007, 13:59:37
   Nu cred ca intaleg ce vrei sa spui ...
     Eu fac 3 foruri imbricate .... si toate sumele asa facute le adaug intr-un vector ... daca suma este "<" decat suma totala la care trebuie sa ajung ...


Titlul: Răspuns: 027 Loto
Scris de: Pandia Gheorghe din Aprilie 17, 2007, 17:21:37
Ideea e sa mergi cu toate forurile pana la "n". Eu faceam 6 foruri cu primul pana la "n-5", al doilea pana la "n-4" ... ultimul pana la "n" si primeam "Wong aswer!" doar pe testul 1. La asta m-am referit.


Titlul: Răspuns: 027 Loto
Scris de: nash mit din Aprilie 17, 2007, 17:41:43
  Da .. am mers .. pana la capat...

acum a mers ...:) .. de fapt era de la cautarea binara ..:| daca te uiti eu am scis asa :
  for(;a<b && ok;)
iar corect era  :
for(;a<=b && ok;)
 ... evident pierdeam un caz posibil ..  :oops:


Titlul: Răspuns: 027 Loto
Scris de: Ionescu Robert Marius din Iulie 03, 2007, 20:02:45
pls,pls imi da si mie cineva valorile de la testu 1 ,ca nu inteleg unde am gresit:(


Titlul: Răspuns: 027 Loto
Scris de: Andrei Homorodean din Iulie 03, 2007, 20:08:24
Nu cred ca-ti va da cineva testul 1... in schimb, poti sa postezi tu niste input-uri si cei cu sursele de 100 sa-ti genereze output-uri.


Titlul: Răspuns: 027 Loto
Scris de: Ionescu Robert Marius din Iulie 03, 2007, 20:18:20
pai eu am 3 WA,10 corecte si 7 TLE deci,,:D nushtiu pe ce fel de teste gresesc ca pe cele testate de mine merge pe toate :'(


Titlul: Răspuns: 027 Loto
Scris de: Adrian Diaconu din Februarie 16, 2008, 17:08:34
S-a facut o reevaluare la aceasta problema.


Titlul: Răspuns: 027 Loto
Scris de: Bivol Mihai din Februarie 16, 2008, 17:38:14
Vad ca testele sunt grupate altfel, dar banuiesc ca nu sunt modificate. De ce iau totusi TLE pe testul 5 daca la prima evaluare am luat 100, s-a modificat altceva in afara de gruparea testelor??


Titlul: Răspuns: 027 Loto
Scris de: Flaviu Pepelea din Februarie 16, 2008, 18:05:55
si eu iau TLE pe acelasi test...in rest 100 ms la 1 singur test..........cred ca ar trebui sa se incadreze in timp






Am reusit ....am bagat un heapsort si a intrat perfect  :winner1:


Titlul: Răspuns: 027 Loto
Scris de: Alexandru Pana din Februarie 16, 2008, 18:25:35
Sunt mai multe motive decat complexitatea programului pentru care iti poate da tle ..


Titlul: Răspuns: 027 Loto
Scris de: Adrian Diaconu din Februarie 16, 2008, 19:05:52
Vad ca testele sunt grupate altfel, dar banuiesc ca nu sunt modificate. De ce iau totusi TLE pe testul 5 daca la prima evaluare am luat 100, s-a modificat altceva in afara de gruparea testelor??

S-au modificat si niste teste (inclusiv testul 5).


Titlul: Răspuns: 027 Loto
Scris de: Razvan Andrus din Aprilie 06, 2008, 15:50:23
am generat toate sumele posibile de cate 3 numere... le-am sortat cu heapsort si apoi am folosit o cautare binara si iau numai 10p  ](*,) please help me !!!


Titlul: Răspuns: 027 Loto
Scris de: Bogdan-Alexandru Stoica din Aprilie 06, 2008, 16:32:34
ai cateva mici scapari:

1) linia 103:
Cod:
for (i=1;i<=n&&ok;i++)
in vectorul sum ai introdus l (l>=n) elemente.

2) linia 133:
Cod:
if (sum[mij][0]>caut) b=mij-1;  
if (sum[mij][0]<caut) a=mij+1;
fie pui si evalitatea la unul din if-uri, fie in loc de al doilea if pui else

3) sumele din sirul tau pot fi mai mari decat S, deci o sa iterezi for-ul de la 103 pana cand S devine mai mica dacat suma curenta. (altfel diferenta o sa fie negativa, deci nu se va gasi in sirul tau, si vei face niste cautari inutile)

ca sa te lamuresti mai bine poti sa consulti sursa (http://infoarena.ro/job_detail/172684?action=view-source) cu modificarile de mai sus.

spor in continuare.  :thumbup:


Titlul: Răspuns: 027 Loto
Scris de: Razvan Andrus din Aprilie 06, 2008, 17:54:19
iti multumesc pentru ajutor fireatmyself ... am luat si eu 100p in sfarsit  \:D/


Titlul: Răspuns: 027 Loto
Scris de: Andrici Cezar din Noiembrie 02, 2008, 19:02:32
mai am si eu o intrebare?
la exemplul 2 la loto nu pot fi numerele:
1 2 3 1 2 3 1 2 3 1 ???


Titlul: Răspuns: 027 Loto
Scris de: Andrei Grigorean din Noiembrie 02, 2008, 19:27:50
Pai trebuie sa fie exact 6 numere, nu 10.


Titlul: Răspuns: 027 Loto
Scris de: Andrici Cezar din Noiembrie 03, 2008, 20:00:05
pot sa intreb cu ce motiv?


Titlul: Răspuns: 027 Loto
Scris de: Sima Cotizo din Noiembrie 03, 2008, 20:03:34
Din enuntul problemei:
Citat
La acest joc, el poate scrie pe un bilet 6 numere, din N numere naturale distincte date de Loteria Nationala; un numar poate fi folosit pe un bilet de mai multe ori.

Deci, din acest motiv :)



Titlul: Răspuns: 027 Loto
Scris de: Manea Constantin din Noiembrie 15, 2008, 13:17:01
Orice combinatie de numere care verifica suma este acceptata? Atata timp cat este unica afisata?


Titlul: Răspuns: 027 Loto
Scris de: Cezar Mocan din Noiembrie 15, 2008, 14:36:53
Da, orice combinatie cu suma S e buna.


Titlul: Răspuns: 027 Loto
Scris de: Manea Constantin din Noiembrie 15, 2008, 20:00:29
Am o problema: o "solutie" trimisa de mine este mentinuta in starea de "in asteptare"... Este pentru ca site-ul este prea ocupat? Sau am trimis prea multe solutii? Sau nu am eu browser-ul bun (adica e de la mine)?


Titlul: Răspuns: 027 Loto
Scris de: Andrei Misarca din Noiembrie 15, 2008, 20:06:07
Evaluatorul este oprit momentan :D


Titlul: Răspuns: 027 Loto
Scris de: Manea Constantin din Noiembrie 15, 2008, 20:15:04
Sper ca nu pentru mult :'(


Titlul: Răspuns: 027 Loto
Scris de: Antal Alin din Februarie 25, 2009, 03:33:42
rezolvarea mea este urmatoarea:
Cod:
var
s,p:longint;
k,j,i,n:integer;
x,l:array[1..100] of integer;
f,g:text;
begin
assign(f,'loto.in');reset(f);
assign(g,'loto.out');rewrite(g);
read(f,n,s);   readln(f);
for k:=1 to n do read(f,l[k]);
for k:=1 to 6 do x[k]:=l[1];
k:=0;
j:=6;
p:=x[k]*6;
while (p<>s) and (j>0) do begin
p:=0;
inc(k);
x[j]:=l[k];
   for i:=1 to 6 do p:=p+x[i];
if k=n then begin k:=1;j:=j-1;end;
end;
if p<>s then write(g,-1) else write(g,x[1],' ',x[2],' ',x[3],' ',x[4],' ',x[5],' ',x[6]);
close(f);
close(g);
end.
imi poate spune si mie cineva de ce primesc zero puncte pe ea? :thumbdown:

[edit] Foloseste tag-ul "code" cand postezi cod.


Titlul: Răspuns: 027 Loto
Scris de: Sima Cotizo din Februarie 25, 2009, 08:00:30
Sursa ta imi pare destul de greu de inteles (nu are nici macar niste comentarii). Daca ne-ai spune cum ai gandit tu rezolvarea te-am putea ajuta mult mai usor!


Titlul: Răspuns: 027 Loto
Scris de: Antal Alin din Februarie 25, 2009, 16:19:27
Cod:
....
for k:=1 to n do read(f,l[k]); {introduc in vectorul L numerele date de Loteria Nationala}
for k:=1 to 6 do x[k]:=l[1];{introduc in vectorul x pe toate pozitiile primul numar dat de loteria nationala}
k:=0;
j:=6;
p:=x[k]*6; {echivalent cu for k:=1 to 6 do p:=p+x[k],dar toate elementele din vector sunt egale}

{aici e un fel de backtracking}
while (p<>s) and (j>0) do begin {cat timp p > s sau < s si avem element precedent in vectorul x DO; valoarea lui j indica pozitia in vectorul x pe care sunt facute urmatoarele modificari:}
p:=0;
inc(k);
x[j]:=l[k];
for i:=1 to 6 do p:=p+x[i];{verificam pe pozitia j din vectorul x toate numerele date de loteria nationala pana cand p=s (avem deja numerele castigatoare) sau k=n (am verificat toate numerele date de loteria nationala). p este suma numerelor alese pentru biletul lui Gigel}
if k=n then begin k:=1;j:=j-1;end; {cand am terminat verificarea tuturor numerelor date de loteria nationala pe pozitia j din vectorul x coboram un nivel in vector si atribui la k valoarea 1 intrucat zero nu are sens, x[j] are deja valoarea l[k+1] data la inceput; (k+1 intrucat avem inc(k) inaintea egalarii)}
end; {Daca nu se poate obtine un bilet castigator structura repetitiva se va opri cand j=0 altfel, se va opri cand p=s}
if p<>s then write(g,-1) else write(g,x[1],' ',x[2],' ',x[3],' ',x[4],' ',x[5],' ',x[6]); {aici nu mai e cazul sa explic}
....
sper ca se intelege acum ce am facut, nu ma pricep prea bine sa exprim in cuvinte modul in care gandesc
[editat de moderator] foloseste tagul code cand vrei sa postezi cod sursa.


Titlul: Răspuns: 027 Loto
Scris de: Sima Cotizo din Februarie 25, 2009, 17:39:24
Pai o observatie:
Cod:
k:=0;
p:=x[k]*6; {echivalent cu for k:=1 to 6 do p:=p+x[k],dar toate elementele din vector sunt egale}
x[ 0 ] nu exista de fapt (uita-te la cum ai declarat). Ar trebui sa ai ori k:=1 ori p:=x[ 1 ]*6.

In rest backtrackingul tau mi se pare gresit, desi e foarte probabil sa nu-l fi inteles eu. Eu unul as folosi o procedura recursiva (o poti scrie tu iterativ daca doresti; mentionez ca nu ma simt in largul meu in pascal):
Cod:
procedure back( nivel:integer );
begin
if ( nivel==7 )
if ( sol==suma_de_la_1_la_6_in_x ) then afisez_solutia;
else
for i:=1 to n do
if ( Utilizat[i]=0 ) then begin
x[nivel]:=l[i]
Utilizat[i]:=1;
back( nivel+1 );
Utilizat[i] := 0;
end;
end;
Vectorul Utilizat[] imi zice daca un numar l-am mai folosit sau nu. "afisez_solutia" si "suma_de_la..." le implementezi tu mai pe larg ;)

Totusi, nu cred ca un back e solutia buna :) mai citeste si pe topicul problemei poate prinzi si alte idei de rezolvare ;)


Titlul: Răspuns: 027 Loto
Scris de: Tuchila Octavian din Februarie 28, 2009, 00:02:35
iau WA pe testele 7,11,13,14,15,16,18 ... imi poate da un hint cineva care cunoaste testele ?


Titlul: Răspuns: 027 Loto
Scris de: Emanuel Cinca din Februarie 28, 2009, 17:16:35
descrie putin metoda ta de rezolvare :)


Titlul: Răspuns: 027 Loto
Scris de: Tuchila Octavian din Martie 03, 2009, 14:07:56
stie cineva testul 7 ?


Titlul: Răspuns: 027 Loto
Scris de: Savin Tiberiu din Martie 04, 2009, 10:50:51
Testele nu sunt publice.


Titlul: Răspuns: 027 Loto
Scris de: Lodoaba Sorin din Martie 28, 2009, 19:17:06
ce tip de fis e CPP-ul??


Titlul: Răspuns: 027 Loto
Scris de: eicar md din Iunie 03, 2009, 12:39:51
check comments


Titlul: Răspuns: 027 Loto
Scris de: Usurelu Catalin din August 05, 2009, 12:36:45
Ce chestie quicksortul meu e de 10 ori mai incet decat sortul din stl. M-am chinuit 2 ore cu sorturi si m-am lasat pagubas, l-am lasat pe cel din stl. Voi ce algoritm de sortare ati folosit ?


Titlul: Răspuns: 027 Loto
Scris de: Flaviu Pepelea din August 05, 2009, 13:21:29
Merge foarte bine cu heapsort  :ok:


Titlul: Răspuns: 027 Loto
Scris de: zloteanu adrian nichita din Septembrie 10, 2009, 13:28:12
Nu inteleg unde se blocheaza.. nu poate fi decat de la sortare:
Cod:
#include<fstream>
#include<algorithm>
using namespace std;
...
int cmp(int a,int b)
{return a<b;}
int main()
...
sort(v2+1,v2+f+1,cmp);
...
return 0;}
http://infoarena.ro/job_detail/346850
Any ideas?


Titlul: Răspuns: 027 Loto
Scris de: speedzeal din Septembrie 10, 2009, 16:22:04
In cazul in care elementele din vectorul v2 incep de pe pozitia 1 si se termina pe pozitia f si vrei sa sortezi crescator nimic nu e gresit, iar v2 trebuie sa fie de tipul int.S-ar putea ca algoritmul tau sa nu fie optim sau sa fie optim si sa se blocheze in alta parte a codului.
Daca vrei sa te lamuresti mai bine http://www.cplusplus.com/reference/algorithm/sort/.


Titlul: LOTO
Scris de: Dogaru Beniamin din Noiembrie 22, 2009, 19:59:57
Stie cineva ce am gresit in sursa urm. de imi da 0 pct.? Am verificat prg. si la mn ruleaza corect si totusi imi da 0 pct.
Cod:
program loto;
uses crt;
var n,i:byte;
    sp:longint;
    g:boolean;
    v,sol:array[1..100]of longint;
procedure ext(i:byte;s:longint);
var x,l:byte;
begin
     if (s=sp)or(i=7)then
        begin
             if (s=sp)and(i=7) then
                g:=true;
        end
     else
          for x:=1 to n do
           if not g then
            if s+v[x]<=sp then
               begin
                    sol[i]:=v[x];
                    ext(i+1,s+v[x]);
               end;
end;
begin
     readln(n);
     readln(sp);
     for i:=1 to n do
         readln(v[i]);
     g:=false;
      ext(1,0);
     if g then
        for i:=1 to 6 do
            write(sol[i],' ')
        else
            writeln(-1);
     readln;
end.


Titlul: Răspuns: 027 Loto
Scris de: Pripoae Teodor Anton din Noiembrie 22, 2009, 20:06:25
Foloseste tag-ul [ code ] (fara spatii) cand postezi surse.

La problema aceasta poti vedea sursele trimise de ceilalti, ia o sursa de 100 de puncte si incearca la tine pe calculator pe un test sa vezi cat ar trebui sa dea.


Titlul: 027 Loto
Scris de: Dogaru Beniamin din Noiembrie 22, 2009, 20:44:50
Cum as putea sa verific timpul in care se ruleaza un prg.?


Titlul: Răspuns: 027 Loto
Scris de: Pripoae Teodor Anton din Noiembrie 22, 2009, 22:05:21
Daca ai linux folosesti functia time din bash. Pt windows folosesti time.h si clock_t. Parca era ceva de genul :

Cod:
#include <stdio.h>
#include <time.h>
int main () {
    clock_t start, finish;
    start = clock();
    ...
    finish = clock();
    printf("%.3lf\n", (finish - start) / CLOCKS_PER_SEC);
}


Titlul: Răspuns: 027 Loto
Scris de: Dogaru Beniamin din Noiembrie 22, 2009, 23:02:55
Ms teodor


Titlul: Răspuns: 027 Loto
Scris de: Vlad Tarniceru din August 20, 2010, 19:42:46
eu am facut in (n^3)*2+(n^2)+2_sorturi_din_STL,unul_care_sorteaza_n_elem, altul_care_sorteaza_n^3 si am luat 100, dar se poate face mai rapid de atat ?  :-s

ps: cred ca este mai rapid totusi cu operatii pe biti si sume partiale

multumesc :D


Titlul: Răspuns: 027 Loto
Scris de: Sima Cotizo din August 20, 2010, 20:45:33
Din cate tin minte, mai jos de O(n3) nu se poate (sortare cu radix?), insa o solutie ok este si O(n3log n3)...

Acum sa mi se ierte postul in eventualitatea in care e gresit :)

PS: My bad am mancat o putere :D


Titlul: Răspuns: 027 Loto
Scris de: Mircea Dima din August 20, 2010, 21:16:16
eu am facut in (n^3)*2+(n^2)+2_sorturi_din_STL,unul_care_sorteaza_n_elem, altul_care_sorteaza_n^3 si am luat 100, dar se poate face mai rapid de atat ?  :-s

ps: cred ca este mai rapid totusi cu operatii pe biti si sume partiale

multumesc :D


Tu ai O(n^3 log (n^3))

Se poate optim in O(n^3) cu hashing


Titlul: Răspuns: 027 Loto
Scris de: Vlad Tarniceru din August 21, 2010, 09:42:36
multumesc mult, dar pana la urma, solutia cu hashing se face la fel, doar ca in loc de cautare binara faci "Search" (cu hashing)? :?


Titlul: Răspuns: 027 Loto
Scris de: Paul-Dan Baltescu din August 22, 2010, 00:52:21
Da.


Titlul: Răspuns: 027 Loto
Scris de: FMI - Roscaneanu George din Februarie 25, 2011, 16:43:32
Incredibil dar aceasta problema am rezolvato in O(n*log n + n^6) cu 100p.
Daca nu ma credeti, uitativa la algoritmul postat de mine.


Titlul: Răspuns: 027 Loto
Scris de: Silion Dragos din Martie 20, 2011, 00:49:23
Trebuie sa aiba cel putin un numar de fiecare?


Titlul: Răspuns: 027 Loto
Scris de: UAIC.VlasCatalin din Noiembrie 05, 2011, 01:00:19
Poate sugera cineva vreo optimizare? :?
http://infoarena.ro/job_detail/630272


Titlul: Răspuns: 027 Loto
Scris de: Paul-Dan Baltescu din Noiembrie 05, 2011, 01:49:56
Daca folosesti hashing ai complexitate O(N^3), in loc de O(N^3logN).


Titlul: Răspuns: 027 Loto
Scris de: Andrei Grigorean din Noiembrie 05, 2011, 09:36:42
Treci pe C++ :)


Titlul: Răspuns: 027 Loto
Scris de: Bodnariuc Dan Alexandru din Ianuarie 18, 2012, 19:34:48
LOL  la naiba ma uitam si nu stiam unde imi greseste programu.. eu foloseam cautare binara dar uitam sa sortez vectoru)) :D


Titlul: Răspuns: 027 Loto
Scris de: Bodnariuc Dan Alexandru din Ianuarie 18, 2012, 19:36:41
apropo mia dat tle pe 5 teste cand declaram variabililele long long in loc de int  hmm nu stiam ca merge mai incet


Titlul: Răspuns: 027 Loto
Scris de: Andrei Hareza din August 19, 2012, 21:27:50
Are cineva vreo idee de ce iau doar 95p pe sursa asta? http://infoarena.ro/job_detail/780132
Sau vreo propunere de eficientizare?


Titlul: Răspuns: 027 Loto
Scris de: Tudor Tiplea din August 19, 2012, 21:46:37
Are cineva vreo idee de ce iau doar 95p pe sursa asta? http://infoarena.ro/job_detail/780132
Sau vreo propunere de eficientizare?

Salut! Incearca sa implementezi cu hash-uri sau pur si simplu sa folosesti un vector, pe care mai apoi il sortezi, in detrimentul Set-ului din STL. Bafta! :)


Titlul: Răspuns: 027 Loto
Scris de: Dumitru Andrei Georgian din August 19, 2012, 21:50:34
Nu e nevoie de hashuri. Eu am luat 100 fara. Cred ca trebuie doar sa scapi de set :)


Titlul: Răspuns: 027 Loto
Scris de: Andrei Hareza din August 20, 2012, 23:51:26
Mersi, am luat 100 cu vectori... Dar nu inteleg de ce ar fi mai eficienti decat seturile, ca ele ma scapau de sumele duble si in plus sorteaza cu complexitate mai buna decat sort-ul pe vectori, fiind log1 + log2 + ... pana la lungimea finala a setului, ceea ce e mai putin decat nlogn


Titlul: Răspuns: 027 Loto
Scris de: Mihai Calancea din August 21, 2012, 00:01:09
Set-ul are constanta mare. Fiind arbore de cautare, sunt ceva operatii acolo sa-l tina echilibrat. In general daca aveti nevoie doar sa sortati lucruri/extrageti cateva minime folositi sortari efective sau priority_queue care sunt dedicate si nu fac munca-n plus.


Titlul: Răspuns: 027 Loto
Scris de: Andrei Grigorean din August 21, 2012, 00:04:38
Mersi, am luat 100 cu vectori... Dar nu inteleg de ce ar fi mai eficienti decat seturile, ca ele ma scapau de sumele duble si in plus sorteaza cu complexitate mai buna decat sort-ul pe vectori, fiind log1 + log2 + ... pana la lungimea finala a setului, ceea ce e mai putin decat nlogn

Setul nu "sorteaza" intr-o complexitate mai buna decat algoritmii clasici de sortare (inclusiv cel implementat in STL), este tot O(N log N). Poti citi mai multe despre complexitati in Cormen.


Titlul: Răspuns: 027 Loto
Scris de: Valentin Radu din Octombrie 07, 2014, 23:18:01
Are cineva vreo idee de ce iau numai 5 puncte pe asa ceva?

Cod:
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("loto.in");
ofstream g("loto.out");
int n, S, a[101], i, b[7];
int descresc(int a, int b)
{
    return a > b;
}
int cresc(int a, int b)
{
    return a < b;
}
int vt = 0;
int term = 1;
void proc(int k, int Sx, int pos)
{
    if (term)
    {
        if (b[1] != 0 && b[2] != 0 && b[3] != 0 && b[4] != 0 && b[5] != 0 && b[6] != 0)
        {
            term = 0;
            sort(b + 1, b + 7, cresc);
            int v = 0;
            for (i = 1; i <= 6; i++) v += b[i];
            if (v == S)
            {
                for (i = 1; i <= 5; i++) g << b[i] << " ";
                g << b[6];
                vt = 1;
                f.close();
                g.close();
                exit(0);
            }
            else vt = 0;
        }
        for (int i = k + 1; i <= n; i++)
        {
            if (a[i] <= Sx)
            {
                if (Sx - a[i] >= 0)
                {
                    b[pos] = a[i];
                    proc(i - 1, Sx - a[i], pos + 1);
                }
                else
                {
                    proc(i, Sx, pos + 1);
                }
            }
        }
    }

}
int main()
{
    f >> n >> S;
    for (i = 1; i <= n; i++) f >> a[i];
    sort(a + 1, a + n + 1, descresc);
    for (int t = 0; t < n; t++)
    {
        proc(t, S, 1);
        for (int l = 1; l <= 6; l++) b[l] = 0;
    }
    if (vt == 0) g << "-1";
    return 0;
}



Titlul: Răspuns: 027 Loto
Scris de: Ionescu Iulian din Octombrie 23, 2015, 09:55:12
Este obligatoriu ca cele N numere sa fie toate prezente pe biletul loto? De ex. avem 4 numere: 1,2,3,4 si suma 13. Biletul loto poate fi:  1,1,2,3,3,3 ?


Titlul: Răspuns: 027 Loto
Scris de: theprdv din Octombrie 30, 2015, 21:53:25
nu, nu este obligatoriu sa ai toate cele N nr.. de ex daca ai N = 43 poti alege de 6 ori numarul de pe pozitia 1
si inca ceva: testele nu verifica situatia prezentata mai sus, cazul in care se ia de 6 ori acelasi nr. Solutia care verifica acest lucru ( http://www.infoarena.ro/job_detail/1514247 ) ia tot 100 ca cea care nu verifica: http://www.infoarena.ro/job_detail/1514257 (verifica doar pt ultima pozitie)
Cod:
Ex test:
3 12
10 2 50