Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 1055 Puteri35  (Citit de 3131 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« : Iunie 04, 2010, 13:26:00 »

Aici puteţi discuta despre problema Puteri35.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #1 : Iulie 30, 2010, 16:06:43 »

as avea nevoie de putin ajutor... iau TLE pe testele de la 7-10  Cry (60 pct in total).am mers pe o idee cu baze de numeratie, si anume am mers de la 3 in sus si am testat pentru fiecare numar daca este preferat de unul sau chiar de amandoi copii(l-am descompus in baza 3 respectiv baza 5 si am pus conditia ca restul sa nu fie mai mare decat 1 (deci sa fie 0 sau 1)), apoi ma opresc cand am gasit primele n numere preferate ale fiecaruia... o solutie mai optima cum ar fi sau cum as putea sa-mi optimizez sursa?
Cod:
#include<stdio.h>
 FILE *f,*g;
    int n1,n2,i;
int desc3(int nr){
int r;
while(nr){
r=nr%3;
nr=nr/3;
if(r>1) return 0;
}
return 1;
}
int desc5(int nr){
int r;
while(nr){
r=nr%5;
nr=nr/5;
if(r>1) return 0;
}
return 1;
}
    int main(){
f=fopen("puteri35.in","r");
g=fopen("puteri35.out","w");
fscanf(f,"%d",&n1);
n2=n1;
--n1;
--n2;
i=3;
fprintf(g,"1\n1\n");
while(n1 || n2){
if(desc3(i) && n1){
fprintf(g,"%d\n",i);
--n1;
}
if(desc5(i) && n2){
fprintf(g,"%d\n",i);
--n2;
}
++i;
}
fclose(g);
return 0;
}
multumesc  Very Happy
   
Memorat
klamathix
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #2 : Iulie 30, 2010, 19:06:51 »

Schimbi solutia complet.

Ai observat ca numerele trebuie sa contina cifre de 0 sau 1 in baza 3 sau in baza 5. Atunci poti genera direct numerele corecte folosindu-te de reprezentarea in baza 2 a celor mai mici numere naturale. Si le interclasezi.


Exemplu : 12 = 1100 ( al 12-lea numar cautat de tine e 5 ^ 3 + 5 ^ 2 , respectiv 3 ^ 3 + 3 ^ 2 )

Spune daca vrei sa-ti detaliez , stiu ca n-am fost foarte coerent. Trebuia sa fie un hint:))


Memorat
BitOne
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 45



Vezi Profilul
« Răspunde #3 : Iulie 30, 2010, 19:44:21 »

Pentru  N=20 si N=1000 cat va da ? Mie imi da :
Cod:
N=20
1
1
3
4
5
6
9
10
12
13
Cod:
N=1000
1
1
3
4
5
6
9
10
12
13
25
26
27
28
30
30
31
31
36
37
39
40
81
82
84
85
90
91
93
94
108
109
111
112
117
118
120
121
125
126
130
131
150
151
155
156
243
244
246
247
252
253
255
256
270
271
273
274
279
280
282
283
324
325
327
328
333
334
336
337
351
352
354
355
360
361
363
364
625
626
630
631
650
651
655
656
729
730
732
733
738
739
741
742
750
751
755
756
756
757
759
760
765
766
768
769
775
776
780
781
810
811
813
814
819
820
822
823
837
838
840
841
846
847
849
850
972
973
975
976
981
982
984
985
999
1000
1002
1003
1008
1009
1011
1012
1053
1054
1056
1057
1062
1063
1065
1066
1080
1081
1083
1084
1089
1090
1092
1093
Memorat
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #4 : Iulie 30, 2010, 19:49:41 »

cred ca am inteles... deci fac generare de 0 si 1 pana la n in baza 2(de exemplu daca n=6, deci 110 in baza 2 nu am voie sa am 111 sau sa depasesc 3 cifre(sa am de exemplu 1000 sau 10110)), dar generarea trebuie sa fie in ordine(adica backtracking care ia mereu solutiile in ordine crescatoare) sau faci alta(si daca da cam cum ar fi Confused ), retii solutiile intr-un vector apoi le sortezi si le afisezi?
Memorat
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #5 : Iulie 30, 2010, 20:27:19 »

am vazut ca cei care au facut cu sume partiale(deci au folosit vector apoi au sortat) au luat majoritatea 70 pct, deci trebuie o sortare care sa sorteze crescator deci cred ca backtracking(daca nu exista o alta generare mai rapida pentru aceasta problema care genereaza crescator(daca exista chiar as vrea s-o aflu  Very Happy ))...

ps:pentru SAlexandru
pentru N=20 mie imi da

Cod:
1
1
3
4
5
6
9
10
12
13
25
26
27
28
30
30
31
31
36
37
39
40
81
82
84
85
90
125
126
130
131
150
151
155
156
625
626
630
631
650
iar pentru N=1000 imi da ultimul numar 2440750
Memorat
BitOne
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 45



Vezi Profilul
« Răspunde #6 : Iulie 30, 2010, 20:34:32 »

Ok, thanks Very Happy dar pune raspunsurile intre tagurile [ code ] [ /code ] ( fara spatii ) ca sa nu ocupe un loc asa mare Smile
Memorat
miculprogramator
Nu mai tace
*****

Karma: 65
Deconectat Deconectat

Mesaje: 306



Vezi Profilul
« Răspunde #7 : Iulie 31, 2010, 12:48:24 »

Eu am luat 70 de puncte folosindu-ma de ideea cu sume. La ultimele 3 teste pe care iau MLE rezultatul dat de programul meu e bun. Ideea este ca nu trebuie sa retii numerele intr-un vector (asa am vazut in solutia oficiala).

@vlad : Algoritmul tau cu descompunerea in bazele 3 si 5 genereaza numerele deja sortate.

P.S : Rezultatele postate la testele cu n = 20 si n = 1000 sunt bune.
Memorat
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #8 : Iulie 31, 2010, 16:22:37 »

am facut problema dupa ideea lui Mihai dar tot iau TLE pe 3 teste Eh? .am incercat sa vad ce optimizari as mai putea face, dar nu mai gasesc. ma puteti ajuta va rog?
Cod:
#include<fstream>
 using namespace std;
 ifstream f("puteri35.in");
 ofstream g("puteri35.out");
    long long n,ac1,ac2,a=1,b=1,v5[100],v3[100],i,n1,n2;
int b23(int a){
long long rez1=0,r,mrg=0;
while(a){
r=a%2;
rez1=rez1+v3[mrg]*r;
++mrg;
a=a/2;
}
return rez1;
}
int b25(int a){
long long rez1=0,r,mrg=0;
while(a){
r=a%2;
rez1=rez1+v5[mrg]*r;
++mrg;
a=a/2;
}
return rez1;
}
    int main(){
f>>n;
n1=n;
n2=n;
v3[0]=v5[0]=1;
for(i=1;i<=30;++i) v3[i]=v3[i-1]*3;
for(i=1;i<=20;++i) v5[i]=v5[i-1]*5;
a=1;
b=1;
while(n1 || n2){
if(ac1>ac2 || n1==0){
if(n2){
ac2=b25(b);
--n2;
++b;
}
}
else
if(n1){
ac1=b23(a);
--n1;
++a;
}
if(ac1>=ac2 && (b25(b)>=ac1 || n2==0)){
g<<ac1<<'\n';
}
else
if(b25(b)<ac1){
ac2=b25(b);
g<<ac2<<'\n';
}
else
if(ac1<=ac2 && (b23(a)>=ac2 || n1==0)){
g<<ac2<<'\n';
}
else
if(b23(a)<ac2){
ac1=b23(a);
g<<ac1<<'\n';
}
}
g.close();
return 0;
}
multumesc  Smile
Memorat
deneo
Vorbaret
****

Karma: 185
Deconectat Deconectat

Mesaje: 160



Vezi Profilul
« Răspunde #9 : August 06, 2010, 14:27:40 »

nu mai folosi streamuri - am folosit si eu dar nu am luat maxim - 100p se ia numai cu scanf si printf
P.S: in concurs a avut 8s timp de executie Very Happy
Memorat
an_drey_curent
Strain


Karma: 4
Deconectat Deconectat

Mesaje: 24



Vezi Profilul
« Răspunde #10 : Aprilie 09, 2012, 16:35:37 »

Determin numerele dorite folosind reprezentarea primelor N numere in baza 2 ( folosind operatii pe biti ),interclasez numerele, totusi iau 80 de pct, chit ca afisez printf sau streamuri. Ce as putea imbunatati spre exemplu la aceasta sursa? http://infoarena.ro/job_detail/732078
Memorat
Steve
Client obisnuit
**

Karma: 36
Deconectat Deconectat

Mesaje: 72



Vezi Profilul
« Răspunde #11 : August 09, 2012, 11:11:43 »

Problema are limita de timp prea mica, am incercat si o sursa care lua inainte 100, acum maximul e de 80.
Am raportat problema aici.

LE: Am luat in final 100 cu diverse optimizari destepte de algoritm, dar oricum trebuie marita limita.
« Ultima modificare: August 14, 2012, 12:16:20 de către Stefan Eniceicu » Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« Răspunde #12 : Ianuarie 15, 2013, 22:17:13 »

Am incercat sa afisez 2 milioane de numere long long, fara sa fac nimic altceva in algoritm si am luat TLE pe ultimele 3 teste.
Cred ca ar trebui marita limita de timp, deoarece cu limita actuala nu intra nici macar afisarea.
Memorat
Steve
Client obisnuit
**

Karma: 36
Deconectat Deconectat

Mesaje: 72



Vezi Profilul
« Răspunde #13 : Ianuarie 16, 2013, 08:06:45 »

Am raportat problema mai demult.
Intra afisarea standard, si poti sa faci problema sa intre, dar trebuie optimizari cu operatii pe biti, ex. nu ai nevoie cand treci de la un numar la urmatorul sa construiesti complet noul numar deoarece primii biti raman la fel, asa ca poti sa bagi LSB. Vad ca inafara de mine mai sunt 2 persoane care au facut-o sa intre pe principiul asta. Daca nu vrei sa astepti pana se schimba limita, poti sa-mi dai un PM sa te ajut.

PS: N-ar strica 0.25 in plus la timp. Smile
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #14 : Ianuarie 16, 2013, 09:21:18 »

Am modificat limita de timp la 1.4
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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