infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva Infoarena Monthly => Subiect creat de: Andrei Grigorean din Martie 05, 2012, 21:42:08



Titlul: 004 Diagonale
Scris de: Andrei Grigorean din Martie 05, 2012, 21:42:08
Aici puteţi discuta despre problema Diagonale (http://infoarena.ro/problema/diagonale).


Titlul: Răspuns: 004 Diagonale
Scris de: Diana Lucaci din Martie 05, 2012, 22:49:11
unde pot gasi solutia?   multumesc :)


Titlul: Răspuns: 004 Diagonale
Scris de: Andrei Grigorean din Martie 05, 2012, 23:15:03
Calculezi suma pe fiecare diagonala si afisezi maximul? Ai grija cum initializezi variabila in care retii maximul pentru ca e posibil ca raspunsul sa fie negativ. Deasemnea, ai grija sa folosesti variabile pe 64 de biti (long long).


Titlul: Răspuns: 004 Diagonale
Scris de: Laurentiu Ion din Martie 05, 2012, 23:15:17
Diana, se vor posta solutiile de la concurs aici (http://"http://infoarena.ro/monthly-2012/runda-2/solutii"), desi nu era problema de idee, ci doar trebuia sa parcurgi matricea si sa tii maximul pentru fiecare diagonala (eu am facut separat pentru cele || cu cea principala si pentru cele || cu cea secundara). Pentru fiecare element, aduni ce e in stanga sus pentru diagonalele asa "\" si ce e in dreapta sus pentru diagonalele asa "/". Ai grija sa lucrezi pe long long  :ok:


Titlul: Răspuns: 004 Diagonale
Scris de: Petrut Lucian din Martie 05, 2012, 23:28:40
Cum puteai face sa se incadreze in 1000 de linii si coloane + variabile longint daca rezolvai in pascal ? Pt ca imi aparea stack overflow daca puneam valori asa mari. Inca un lucru : m-am uitat si in regulament si n-am gasit de unde vin defapt punctele de penalizare:)


Titlul: Răspuns: 004 Diagonale
Scris de: Mihai Calancea din Martie 05, 2012, 23:31:45
http://infoarena.ro/monthly-2012/format


Titlul: Răspuns: 004 Diagonale
Scris de: Laurentiu Ion din Martie 06, 2012, 01:21:14
Cum puteai face sa se incadreze in 1000 de linii si coloane + variabile longint daca rezolvai in pascal ? Pt ca imi aparea stack overflow daca puneam valori asa mari. Inca un lucru : m-am uitat si in regulament si n-am gasit de unde vin defapt punctele de penalizare:)

Nu-s bun la Pascal (personal te sfatuiesc sa treci mai departe) dar daca primesti stack overflow si crezi ca e de la declararea matricei (apropo, matricea din input poate fi int) atunci probabil ca declari in interiorul functiei, declara global  :thumbup:


Titlul: Răspuns: 004 Diagonale
Scris de: Tudor Tiplea din Martie 06, 2012, 14:55:18
Nu ai nevoie de matrice, poti citi cu doar o variabila pe care o aduni la suma corespunzatoare diagonalei pe care se afla. (aceste sume le retii in 2 vectori). Bafta!


Titlul: Răspuns: 004 Diagonale
Scris de: Idomir Alin din Martie 06, 2012, 18:42:28
Am avut grija la cazuri, am initializat variabilele cu long long, am initializat maximul cu - 10^9 si nu stiu unde gresesc, pentru ca iau incorrect la ultimul test. Poate ma poate ajuta cineva.


Titlul: Răspuns: 004 Diagonale
Scris de: Macarescu Sebastian din Martie 06, 2012, 19:06:17
@Idomir: Pai vezi ca nu e bine  :P. Ai pe o diagonala maxim N elemente care sunt in  modul mai mici decat 10^9; Cand faci suma lor  obtii un maxim de 1000 * 10^9. Deci initializeaza maximul cu -2^63 .


Titlul: Răspuns: 004 Diagonale
Scris de: Tudor Tiplea din Martie 06, 2012, 19:44:22
@Idomir: Pai vezi ca nu e bine  :P. Ai pe o diagonala maxim N elemente care sunt in  modul mai mici decat 10^9; Cand faci suma lor  obtii un maxim de 1000 * 10^9. Deci initializeaza maximul cu -2^63 .

Nu e neaparat ca asta sa fie problema deoarece elementele din colturi sunt mai mari decat -10^9. Eu am luat 100 chiar si cu maximul initializat cu -9.99999999*10^8.


Titlul: Răspuns: 004 Diagonale
Scris de: Macarescu Sebastian din Martie 06, 2012, 20:21:45
@Tiplea: Eu luam 0 cand initializam cu 10^9. Cand am schimbat cu 2^63 am luat 100  :P


Titlul: Răspuns: 004 Diagonale
Scris de: Boaca Cosmin din Martie 06, 2012, 22:25:09
Eu am initializat cu -7-10^9 si am luat 100.


Titlul: Răspuns: 004 Diagonale
Scris de: Florin eu din Martie 08, 2012, 19:11:06
^^Cum faceti  initializarile cu valorile astea mari ? 2^63 ?Vad ca nu intra in long double,are mai mult de 18 cifre.. :roll:


Titlul: Răspuns: 004 Diagonale
Scris de: George Marcus din Martie 08, 2012, 20:10:07
E bun orice numar mai mic sau egal cu -N * 109.


Titlul: Răspuns: 004 Diagonale
Scris de: Laurentiu Ion din Martie 08, 2012, 20:35:11
^^Cum faceti  initializarile cu valorile astea mari ? 2^63 ?Vad ca nu intra in long double,are mai mult de 18 cifre.. :roll:


Trebuie sa folosesti long long, nu double... este pe 64 de biti deci maximul este 2^63 - 1 (ultimul bit este pentru semn, daca nu folosesti unsigned long long). De asemenea, ai grija cand initializezi, sa folosesti 1LL, nu doar 1 (constantele by default sunt int).


Titlul: Răspuns: 004 Diagonale
Scris de: Andrei Grigorean din Martie 09, 2012, 14:53:05
Puteti sa initializati maximul cu A[1][1] :)


Titlul: Răspuns: 004 Diagonale
Scris de: Ionescu Marius din Martie 10, 2012, 20:39:19
Imi da incorect pe ultimul test ](*,)Stie cnv care ar putea fi problema ?


Titlul: Răspuns: 004 Diagonale
Scris de: Gabriel Bitis din Martie 10, 2012, 23:49:11
S-ar putea sa nu iei in considerare suma maxima negativa, sau sa nu initializezi maximul cu o valoare corecta.


Titlul: Răspuns: 004 Diagonale
Scris de: Ionescu Marius din Martie 11, 2012, 09:10:48
Am initializat si cu -2^63 si -10^9 si am obtinut acelas rezultat.La ce te referi prin suma maxima negativa ?  :-k


Titlul: Răspuns: 004 Diagonale
Scris de: George Marcus din Martie 11, 2012, 14:10:28
Adica toata matricea e formata din numere negative.

Ok, m-am uitat la sursa ta. Noi cand scriem 10^9 sau 2^63 ne referim la operatia de ridicare la putere, pe cand daca tu scrii aia intr-un program C, el va face operatia XOR pe biti. Deci in loc sa scrii -10^9 poti scrie explicit -1000000000.


Titlul: Răspuns: 004 Diagonale
Scris de: Ionescu Marius din Martie 12, 2012, 09:32:51
Multumesc.Am luat 100 acum.


Titlul: Răspuns: 004 Diagonale
Scris de: Cobzaru Adrian-Andrei din Mai 21, 2012, 19:16:41
Eu pic vreo 4 teste din cauza ca e gresit, dar eu am verificat si programul imi calculeaza corect sumele.Ma puteti ajuta?

Cod:
#include<fstream>
using namespace std;
#include<values.h>
long long a[1001][1001];
int main()
{
ifstream fcin("diagonale.in");
ofstream fcout("diagonale.out");
int i,j,n;
long long s,max=-LONG_LONG_MAX;
fcin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
fcin>>a[i][j];
//diagonala principala
s=0;
for(i=1;i<=n;i++)
s+=a[i][i];
if(s>max)
max=s;
//parelelele de deasupra diagonalei principale
for(i=2;i<=n;i++)
{
s=0;
for(j=i;j<=n;j++)
s+=a[j-i+1][j];
if(s>max)
max=s;
}
//parelelele de dedesubtul diagonalei principale
for(i=2;i<=n;i++)
{
s=0;
for(j=2;j<=n;j++)
s+=a[j][j-i+1];
if(s>max)
max=s;
}
//diagonala secundara
s=0;
for(i=1;i<=n;i++)
s+=a[i][n-i+1];
if(s>max)
max=s;
//parelelele de deasupra diagonalei secundare
for(i=1;i<n;i++)
{
s=0;
for(j=1;j<=i;j++)
s+=a[j][i-j+1];
if(s>max)
max=s;
}
//paralelele de deasubtul diagonalei secundare
for(i=2;i<=n;i++)
{
s=0;
for(j=i;j<=n;j++)
s+=a[j][n-j+i];
if(s>max)
max=s;
}
fcout<<max;
return 0;
}


Titlul: Răspuns: 004 Diagonale
Scris de: George Marcus din Mai 21, 2012, 20:03:29
Nu cred ca e bine la "parelelele de dedesubtul diagonalei principale".


Titlul: Răspuns: 004 Diagonale
Scris de: Cobzaru Adrian-Andrei din Mai 21, 2012, 21:27:47
Da, acolo era problema, si bineinteles, "greaseala de tipar"  :D (pusesem intr-un for j=2 in loc de j=i...i care la inceput avea valoarea 2 si probabil de aia). Oricum, multumesc pentru ajutor.


Titlul: Răspuns: 004 Diagonale
Scris de: Cretu Bogdan din Iulie 19, 2013, 17:51:27
Ma puteti ajuta si pe mine?  :D
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???


Titlul: Răspuns: 004 Diagonale
Scris de: Mihai Calancea din Iulie 19, 2013, 18:18:14
Nu. Un set/o multime poate avea un singur element.


Titlul: Răspuns: 004 Diagonale
Scris de: Cretu Bogdan din Iulie 19, 2013, 18:36:06
Mda...m-am lamurit :D
Mersi! :P


Titlul: Răspuns: 004 Diagonale
Scris de: Ispas Alexandru din 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 ?


Titlul: Răspuns: 004 Diagonale
Scris de: Ispas Alexandru din Decembrie 05, 2013, 21:44:28
am rezolvat cu stack overflow dar memoria si timpul trece cu mult peste


Titlul: Răspuns: 004 Diagonale
Scris de: George Marcus din 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.


Titlul: Răspuns: 004 Diagonale
Scris de: Ispas Alexandru din 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?


Titlul: Răspuns: 004 Diagonale
Scris de: George Marcus din 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.


Titlul: Răspuns: 004 Diagonale
Scris de: Ispas Alexandru din 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 ?


Titlul: Răspuns: 004 Diagonale
Scris de: Prehari Romica din Decembrie 06, 2013, 16:28:26
initializeaza  maxp si maxs cu 12 zerouri, adica -1000000000000


Titlul: Răspuns: 004 Diagonale
Scris de: George Marcus din 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.


Titlul: Răspuns: 004 Diagonale
Scris de: Ispas Alexandru din 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:


Titlul: Răspuns: 004 Diagonale
Scris de: Ispas Alexandru din Decembrie 06, 2013, 16:52:43
La indici era problema, am rezolvat, multumesc frumos !


Titlul: Răspuns: 004 Diagonale
Scris de: Mihai Grebla din Ianuarie 09, 2017, 20:02:47
Poate pune cineva, va rog, niste fisiere de test?