infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Plesa Mihail Iulian din Februarie 15, 2013, 18:25:38



Titlul: problema .campion
Scris de: Plesa Mihail Iulian din 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 :(. Imi puteti da un sfat va rog? :)
Multumesc !


Titlul: Răspuns: problema .campion
Scris de: fdproxy din 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.


Titlul: Răspuns: problema .campion
Scris de: Stefan Eniceicu din 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.


Titlul: Răspuns: problema .campion
Scris de: fdproxy din 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;
}


Titlul: Răspuns: problema .campion
Scris de: Plesa Mihail Iulian din 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 !