Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: problema .campion  (Citit de 1232 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
mihai.plesa
Client obisnuit
**

Karma: 0
Deconectat Deconectat

Mesaje: 74



Vezi Profilul
« : Februarie 15, 2013, 18:25:38 »

Salut!
Am incercat sa fac problema http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=510
Am implementat-o dupa indicatiile de rezolvare:
Cod:
#include<fstream>
using namespace std;
int main()
{
    fstream f,g;
    f.open("tren1.in",ios::in);
    g.open("tren1.out",ios::out);
    int n,sum[50000],m,x,i,j,k=3;
    long long s[50000][3];
    f>>n;
    sum[0]=0;
    for(i=1; i<=n; i++)
    {
        f>>x;
        sum[i]=sum[i-1]+x;
    }
    f>>m;
    for(i=1; i<=m; i++)
        for(j=1; j<=k; j++)
        s[i][j]=sum[i];
    for(i=m+1; i<=n; i++)
        for(j=1; j<=k; j++)
    {
        s[i][j]=s[i-1][j];
        if(s[i-1][j]<s[i-m][j-1]+sum[i]-sum[i-m])
            s[i][j]=s[i-m][j-1]+sum[i]-sum[i-m];

    }
    g<<s[n][k];
}
La unele dintre teste imi apare "Killed by signal: 11"...din cate stiu eu se refera la memorie. Daca declar s[50000][4] imi apare mesajul de mai sus...daca declar mai putin (s[500][4]) nu imi ia testele...chiar nu stiu cum sa fac Sad. Imi puteti da un sfat va rog? Smile
Multumesc !
Memorat
fdproxy
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #1 : Februarie 15, 2013, 20:17:37 »

Nu am studiat problema pe care incearca s-o rezolve aplicatia. Am cateva observatii legate de implementare:
 - De ce vectorii s si sum trebuie sa fie atat de mari? Stiva, probabil ca nu este foarte multumita. Nu programez sub Linux, dar probabil ca mesajul de eroare inseamna ca ai depasit dimensiunea maxima a stivei.
 - De ce fstream si nu ifstream si ofstream?
 - Deschiderea cu succes a unui fisier trebuie confirmata:
       std::ifstream is( "tren1.in" );
         if ( ! is )
           return -1; // eroare la deschidere

 - Este indicat ca variabilele locale sa fie declarate pe masura ce sunt folosite. De exemplu, nu are rost sa declari i la inceputul functiei daca este folosit doar in for. Mai corect ar fi: for ( int i = 0; i < n; ++ i )
 - Functia main trebuie sa intoarca o valoare.


Succes.
« Ultima modificare: Februarie 15, 2013, 21:16:33 de către fdproxy » Memorat
Steve
Client obisnuit
**

Karma: 36
Deconectat Deconectat

Mesaje: 72



Vezi Profilul
« Răspunde #2 : Februarie 15, 2013, 20:30:44 »

Incearca sa declari vectorii mari in afara mainului (pe heap ai mai mult decat pe stiva). Asa ar trebui sa nu mai ai KBS-uri.
BTW: "renul despre care discutam este format dintr-o locomotiva si N vagoane"...made my day.
Memorat
fdproxy
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #3 : Februarie 15, 2013, 21:16:00 »

Incearca sa declari vectorii mari in afara mainului (pe heap ai mai mult decat pe stiva)

Inainte de a muta declaratia variabilelor, estimeaza spatiul necesar: probabil ca 50000 este mai mult decat ai nevoie.

Variabilele globale (cele declarate in afara functiei main) sunt alocate intr-un alt segment de memorie, nu pe heap.

//...
int g_i; // variabila globala
//...
int main()
{
  int i; // variabila locala
  int* pi = new int; // pi este locala dar indica catre o zona de memorie alocata din heap
  *pi = 10; // memoria de pe heap va contine 10
  delete pi; // elibereaza memoria alocata
  return 0;
}
Memorat
mihai.plesa
Client obisnuit
**

Karma: 0
Deconectat Deconectat

Mesaje: 74



Vezi Profilul
« Răspunde #4 : Februarie 17, 2013, 13:24:31 »

Incearca sa declari vectorii mari in afara mainului (pe heap ai mai mult decat pe stiva). Asa ar trebui sa nu mai ai KBS-uri.
BTW: "renul despre care discutam este format dintr-o locomotiva si N vagoane"...made my day.

A functionat acum...multumesc mult !
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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