Pagini: 1 [2]   În jos
  Imprimă  
Ajutor Subiect: 004 Diagonale  (Citit de 48297 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
reking
Strain
*

Karma: 3
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #25 : Iulie 19, 2013, 17:51:27 »

Ma puteti ajuta si pe mine?  Very Happy
Chiar nu inteleg ce are sursa mea ... pe toate testele iau incorect.
Cod:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("diagonale.in");
ofstream g("diagonale.out");
int a[1001][1001],n;
int calculeaza (int x)
{
    int i,y,sum1=0,sum2=0,k=x;
    y=1;
    while (x<=n && y<=n)
    {
        sum1=sum1+a[x][y];
        x++;
        y++;
    }
    x=k;
    while (x<=n && 1<=y)
    {
        sum2=sum2+a[x][y];
        x++;
        y--;
    }
    if (sum1>sum2) return sum1;
    else return sum2;
}
int main ()
{
    int i,j,summax,sum;
    f>>n;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            f>>a[i][j];
    summax=a[n][1];
    for (i=n;i>=1;i--)
    {
        sum=calculeaza(i);
        if (summax<sum) summax=sum;
    }
    for (i=2;i<=n-1;i++)
    {
        sum=calculeaza(i);
        if (summax<sum) summax=sum;
    }
    g<<summax<<'\n';
}
"Prin diagonala, pe langa diagonala principala si cea secundara a matricei, ne vom referi la orice set de elemente situat pe o dreapta paralela cu una dintre acestea." - SET DE ELEMENTE, deci o diagonala are cel putin 2 elemente, nu???
Memorat
klamathix
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #26 : Iulie 19, 2013, 18:18:14 »

Nu. Un set/o multime poate avea un singur element.
Memorat
reking
Strain
*

Karma: 3
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« Răspunde #27 : Iulie 19, 2013, 18:36:06 »

Mda...m-am lamurit Very Happy
Mersi! Tongue
Memorat
FearDotCom
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #28 : Decembrie 05, 2013, 20:07:05 »

#include <stdio.h>
 
#define INPUT "diagonale.in"
#define OUTPUT "diagonale.out"
 
long long maxParaleleP (int n, long long a[1001][1001]){ //calculeaza suma maxima a liniilor paralele cu diagonala princpala
    int i,j,k;
    long long s,max=a[0][0];
    for (k=0; k<n-1; k++){
        s=0;
        for (i=0; i<n; i++)
            for (j=0; j<n; j++)
                if (i-j==k)
                    s=s+a[j];
        if (s>max)
            max=s;
    }
    return max;
}
 
long long maxParaleleS (int n, long long a[1001][1001]){  //calculeaza suma maxima a liniilor paralele cu diagonala secundara
    int i,j,k;
    int s,max=max=a[0][0];
    for (k=(n-1)*2; 0<k; k--){
        s=0;
        for (i=0; i<n; i++)
            for (j=0; j<n; j++)
                if (i+j==k)
                    s=s+a[j];
        if (s>max)
            max=s;
    }
    return max;
}
 
int main(){
    int n;
    long long a[1001][1001];
 
    freopen(INPUT,"r",stdin);
    freopen(OUTPUT,"w",stdout);
    scanf("%d",&n);
 
 
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            scanf("%lld",&a[j]);
 
    if (maxParaleleP(n,a) > maxParaleleS(n,a))
        printf("%lld",maxParaleleP(n,a));
    else
        printf("%lld",maxParaleleS(n,a));
    return 0;
}

de ce imi da stack overflow ? si cu [1000][1000] merge ? cum se face ca depasesc memoria si timpul si celelalte surse de le`am vazut nu depasesc ?
Memorat
FearDotCom
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #29 : Decembrie 05, 2013, 21:44:28 »

am rezolvat cu stack overflow dar memoria si timpul trece cu mult peste
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #30 : Decembrie 05, 2013, 22:33:21 »

Algoritmul tau e O(N^3) fiindca gasesti prea ineficient diagonalele. Poate te ajuta articolul cu solutii: http://www.infoarena.ro/monthly-2012/runda-2/solutii.
Memorat
FearDotCom
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #31 : Decembrie 06, 2013, 14:55:24 »

#include <stdio.h>

#define INPUT "diagonale.in"
#define OUTPUT "diagonale.out"


int main(){
   int n,i,j;
   long long x;
   long long dp[2000], ds[2000];
   long long maxp,maxs;

   freopen(INPUT,"r",stdin);
   freopen(OUTPUT,"w",stdout);
   
   scanf("%d",&n);

   for (i=0; i<2*n-1; i++){
      dp=0;
      ds=0;
   }

   for (i=0; i<n; i++)
      for (j=0; j<n; j++){
         scanf("%lld",&x);
         dp[n+i-j]=dp[n+i-j]+x;
         ds[i+j]=ds[i+j]+x;
      }

      maxp=-1000000000;
      maxs=-1000000000;

   for (i=0; i<2*n-1; i++){
      if (dp>maxp)
         maxp=dp;
      if (ds>maxs)
         maxs=ds;
   }

   if (maxp>maxs)
      printf("%lld",maxp);
   else
      printf("%lld",maxs);

}


cum de iau incorect la ultimul test?
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #32 : Decembrie 06, 2013, 15:00:59 »

Gresesti la indici. Vezi ca in articol se lucreaza cu 1..n iar tu lucrezi cu 0..n-1. Si daca mai postezi cod, foloseste tagul code.
Memorat
FearDotCom
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #33 : Decembrie 06, 2013, 16:14:48 »

imi cer scuze sunt nou pe site, dar nu vad care este problema cu indicii ca ii notez eu 0 n-1 ca ii notez 1 n pana la urma suma de pe diagonale tot aia e nu ?
Memorat
romyk
Strain
*

Karma: 5
Deconectat Deconectat

Mesaje: 40



Vezi Profilul
« Răspunde #34 : Decembrie 06, 2013, 16:28:26 »

initializeaza  maxp si maxs cu 12 zerouri, adica -1000000000000
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #35 : Decembrie 06, 2013, 16:40:23 »

Nu e nevoie de -10^12, deoarece maximul va fi tot timpul cel putin -10^9.

Suma tot aceeasi e, dar trebuie sa iti adaptezi formulele. Daca ai indicii 0..n-1 atunci 0 <= i+j <= 2*n-2 si 1 <= n+i-j <= 2*n-1. Deci probabil trebuie sa pui doar un -1.
Memorat
FearDotCom
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #36 : Decembrie 06, 2013, 16:41:23 »

Cod:
#include <stdio.h>
 
#define INPUT "diagonale.in"
#define OUTPUT "diagonale.out"
 
 
int main(){
    int n,i,j;
    long long x;
    long long dp[2000], ds[2000];
    long long maxp,maxs;
 
    freopen(INPUT,"r",stdin);
    freopen(OUTPUT,"w",stdout);
    
    scanf("%d",&n);
 
    for (i=1; i<=2*n-1; i++){
        dp[i]=0;
        ds[i]=0;
    }
 
    for (i=1; i<=n; i++)
        for (j=1; j<=n; j++){
            scanf("%lld",&x);
            dp[n+i-j]=dp[n+i-j]+x;
            ds[i+j]=ds[i+j]+x;
        }
 
        maxp=-1000000000;
        maxs=-1000000000;
 
    for (i=1; i<=2*n-1; i++){
        if (dp[i]>maxp)
            maxp=dp[i];
        if (ds[i]>maxs)
            maxs=ds[i];
    }
 
    if (maxp>maxs)
        printf("%lld",maxp);
    else
        printf("%lld",maxs);
 
}

am incercat si cu indicii si tot nu ia ultimu test  sad
Memorat
FearDotCom
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #37 : Decembrie 06, 2013, 16:52:43 »

La indici era problema, am rezolvat, multumesc frumos !
Memorat
mitza23
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 2



Vezi Profilul
« Răspunde #38 : Ianuarie 09, 2017, 20:02:47 »

Poate pune cineva, va rog, niste fisiere de test?
Memorat
Pagini: 1 [2]   În sus
  Imprimă  
 
Schimbă forumul:  

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