| | |
| Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
Autor | Správa |
---|
Registrovaný: 06.01.07 Prihlásený: 18.12.11 Príspevky: 16 Témy: 5 | Napísal apatka: 18.12.2011 19:33 | |
|
mam takyto naky programik ... problem mam v tom ze ked za x dosadim vacsie cislo ako nakych 40tis tak mi program padne hned na zaciatku .. asi nieco s alokaciou pamati
co mam spravit aby mi to zobralo aj viac
nie som programator tak poprosim budte zhovievavy, moje znalosti cecka su limitovane
Kód: #include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) { int x=40000; int max[8]={0,10,10,10,10,7,7,7}; int end[8]={0,9,5,5,0,5,5,5}; int stav[8][x]; int riadok[x]; int index[x]; int nad1[x]; int nad2[x]; stav[1][0]=10; stav[2][0]=10; stav[3][0]=0; stav[4][0]=0; stav[5][0]=0; stav[6][0]=7; stav[7][0]=7; riadok[0]=0; index[0]=-1; nad1[0]=0; nad2[0]=0;
printf ("0 - START %d %d %d %d %d\n\n", stav[1][0], stav[2][0], stav[3][0], stav[4][0], stav[5][0], stav[6][0], stav[7][0]);
int c,prelej,in,n,m,k,j=1;
for(in=1;in<=1000000;in++){ for(n=7;n>=1;n--){ for(m=1;m<=7;m++){ if (n==m){ continue; } if ((stav[m][in-1]<max[m]) and (stav[n][in-1]!=0)){ prelej = stav[n][in-1]+stav[m][in-1]; stav[1][j]=stav[1][in-1]; stav[2][j]=stav[2][in-1]; stav[3][j]=stav[3][in-1]; stav[4][j]=stav[4][in-1]; stav[5][j]=stav[5][in-1]; stav[6][j]=stav[6][in-1]; stav[7][j]=stav[7][in-1]; if (prelej <= max[m]){ stav[m][j]=prelej; stav[n][j]=0; } else { stav[m][j]=max[m]; stav[n][j]=prelej-max[m]; } for(k=1;k<j;k++){ if ((stav[1][j]==stav[1][k]) and (stav[2][j]==stav[2][k]) and (stav[3][j]==stav[3][k]) and (stav[4][j]==stav[4][k]) and (stav[5][j]==stav[5][k]) and (stav[6][j]==stav[6][k]) and (stav[7][j]==stav[7][k])){ goto end; } } riadok[j]=j; index[j]=in-1; nad1[j]=n; nad2[j]=m; printf ("%d %d %d->%d ", riadok[j], index[j], nad1[j], nad2[j]); printf ("%d %d %d %d %d %d %d\n", stav[1][j], stav[2][j], stav[3][j], stav[4][j], stav[5][j], stav[6][j], stav[7][j]); if ((stav[1][j]==end[1]) and (stav[2][j]==end[2]) and (stav[3][j]==end[3]) and (stav[4][j]==end[4]) and (stav[5][j]==end[5]) and (stav[6][j]==end[6]) and (stav[7][j]==end[7])){ goto quit; } j++; } end: c++; } } } quit: printf ("\n----------------------------------------------\n\n"); while (j!=0){ printf ("%d %d %d->%d ", riadok[j], index[j], nad1[j], nad2[j]); printf ("%d %d %d %d %d\n", stav[1][j], stav[2][j], stav[3][j], stav[4][j], stav[5][j], stav[6][j], stav[7][j]); j=index[j]; }
system("PAUSE"); return EXIT_SUCCESS; }
|
|
Registrovaný: 11.01.09 Prihlásený: 26.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 18.12.2011 20:05 | |
|
Mne to na linuxe nepada, takze napis, aku chybu ti to hodi, pripadne ak ziadnu, spust program v debuggeri ( ak nevies ako, napis, ake prostredie pouzivas ) a povedz, na akom riadku ti to stopne. Plus daj nejake blizsie info, aky OS, co to ma robit, atd.
Neviem, ci to mas do skoly, alebo len tak, ale nie je velmi dobre ( minimalne na pohlad ), ked sa mixuje C a C++. Tym chcem naznacit, ze nieco ako printf by v C++ nemalo co robit. A navestia uz vobec nie, to patri tak do assembleru, maximalne do C. Takisto nejaky pokus o vytvorenie objektov by nezaskodil ( napr v takej jave to je nutnost ). Ale to len tak na okraj, pre buducnost, ak sa tomu hodlas venovat. Som zhovievavy
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 18.12.2011 20:10 | |
|
To mi ani neprejde prekladom. Obávam sa, že toto nie je ani C, ani C++
Každopádne, povedal by som, že 40000 je proste veľa. Buď to alokuj dynamicky, alebo tam nedávaj tak veľké polia.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 06.01.07 Prihlásený: 18.12.11 Príspevky: 16 Témy: 5 | Napísal autor témy apatka: 18.12.2011 20:36 | |
|
ano nepada to pokial mas x=40tis ... daj si to 50tis a tak vyskusaj
mam iba nake free c++ ... myslel som si aj ze to je v tom ale skusal som to v troch roznych a vzdy to dopadlo rovnako (DEv-C++, CodeLite a este cosi, uz som to vymazal)
vyhlasuje mi to nejaku "chybu segmentacie"
a je to program na prelievanie medzi nadobami ... mas definovane velkost nadoby max[], pozadovany konecny stav end[] a zaciatocny stav stav[][]
postupne ti to prelieva az kym sa nedostanes k rieseniu a to ti potom este prekne vypise // pridané po 19 minútach od posledného príspevkualokovat dynamicky ... hmmmm ... vravim ze moje zalosti su limitovane
ak to takto nejde riesit tak ok ... kludne napiste a nieco vymyslim ine ... som myslel ze mozno na to bude naka jednoduca finta
povodne som to spravil v phpcku, v ktorom mi to ide trocha lepsie ... ale cim viac mate nadob tak to trva dlhsie ... toto konkretne mi pocitalo asi dve hodiny kym som sa na to vykaslal a uznal ze to skor nakodim v cecku ako mi to dorata ...
za tie dve hodky v php sa mi to dostalo do stavu zhruba ako v cecku za pol minutu ")
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 18.12.2011 20:42 | |
|
A som si istý, že by sa to dalo zraziť až na niekoľko milisekúnd (40000 za pol minúty? To je moc)
Dynamické alokovanie nie je sranda. Treba byť doma v pointrovej aritmetike, čo je pre php-čkara problém.
Ak ti ale naozaj ide o veľké vstupy, tak si pekne naštuduj funkciu malloc()
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 06.01.07 Prihlásený: 18.12.11 Príspevky: 16 Témy: 5 | Napísal autor témy apatka: 18.12.2011 20:50 | |
|
40000 je len pocet zapisanych preliati ... po kazdom kontrolujem ci uz som rovnaky stav nemal predtym, resp. ci sa stav zmenil (napr. ak prelievas do plnej nadoby nic sa nezmeni)
skutocne vykonanych preliati je niekolkonasobne viac
naviac ked vypisujem kazdy riadok na obrazovku tak mozno aj to pridava na case ... ci nie? ... kazdopadne cas nie je problem .. pokial sa nebavime o hodinach a viac
tu sa inak natiska otazka aj hned, ci mi vobec dynamicke alokovanie pomoze kedze si pamatam vsetky mozne predchadzajuce stavy a nemozem uvolnit nic z pamate?? ... cize tych 40000 (a viac) bude mat alokovanych tak ci tak
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 18.12.2011 21:24 | |
|
No dobre, daj sem presné znenie úlohy a skúsime vymyslieť niečo normálnejšie.
(a áno, printf zožerie veľa času)
// Inak, malo by stačiť, keď si tie polia zadeklaruješ pred funkciou main. Data sektor je veľký, takže veľké vstupy zoberie
(prečo ma to nenapadlo skôr...)
|
|
Registrovaný: 06.01.07 Prihlásený: 18.12.11 Príspevky: 16 Témy: 5 | Napísal autor témy apatka: 19.12.2011 23:41 | |
|
supeeer ... dik ... presne takuto naku fintu som hladal
sice mi to bezalo snad aj hodinu ale nakonec sa doratal k rieseniu
stacilo na to len nieco malo nad 260tis riadkov
vsetkych preliati ratalo ale snad aj na milardy
kazdopadne vdaka za pomoc ... mas u mna male bezvyznamne plus
|
|
| Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|