Furnicuţa şi-a construit un depozit pentru grăunţe pe o suprafaţă de teren dreptunghiulară şi l-a compartimentat în N*M
camere identice, de formă pătratică, dispuse câte M
pe direcţia Ox
şi câte N
pe direcţia Oy
. Din fiecare cameră se poate intra în orice cameră învecinată cu ea (cameră care are un perete comun cu aceasta).
În fiecare cameră, identificată prin coordonatele sale, ca în desenul alăturat în care N=5
şi M=4
, furnica a depozitat o cantitate de grăunţe. De exemplu, în camera de coordonate (I,J)
este depozitată cantitatea C
IJ
de grăunţe.
Atât intrarea cât şi ieşirea din depozit se poate face doar prin cele patru camere din colţurile depozitului, adică cele de coordonate (1,1)
, (1,M)
, (N,1)
şi (N,M)
care comunică cu exteriorul.
Pentru a asigura circulaţia aerului în depozit, furnica a montat un sistem de ventilaţie în camera de coordonate (X,Y)
.
Văzând ce multe grăunţe are furnica pentru iarnă, vecinul ei, leneşul greieraş Cri, s-a hotărât să fure din ele.
Cri s-a gândit să intre în depozit prin sistemul de ventilaţie din camera de coordonate (X,Y)
şi să iasă prin una din cele 4
camere din colţurile depozitului care comunică cu exteriorul.
A studiat planul depozitului şi a împărţit camerele în patru zone:
- prima zonă, numerotată cu
1
, conţine toate camerele de coordonate(I,J)
cu1 ≤ I ≤ X
şi1 ≤ J ≤ Y
, cu ieşirea prin camera de coordonate(1,1)
- a doua zonă, numerotată cu
2
, conţine toate camerele de coordonate(I,J)
cu1 ≤ I ≤ X
şiY ≤ J ≤ M
, cu ieşirea prin camera de coordonate(1,M)
- a treia zonă, numerotată cu
3
, conţine toate camerele de coordonate(I,J)
cuX ≤ I ≤ N
şi1 ≤ J ≤ Y
, cu ieşirea prin camera de coordonate(N,1)
- a patra zonă, numerotată cu
4
, conţine toate camerele de coordonate(I,J)
cuX ≤ I ≤ N
şiY ≤ J ≤ M
, cu ieşirea prin camera de coordonate(N,M)
Cri va intra doar într-una din cele patru zone şi va fura grăunţele doar din camerele conţinute de zona aleasă. Pentru a nu declanşa alarma furnicuţei, el va trebui să treacă cel mult o dată prin fiecare cameră din zonă, să fure întreaga cantitate de grăunţe din aceasta şi să iasă din depozit prin camera ce comunică cu exteriorul, corespunzătoare zonei alese.
Cri va trebui să aleagă zona în care va intra astfel încât cantitatea totală T
de grăunţe furate să fie maximă, iar numărul K
de camere prin care va trece să fie minim.
Cerința
Scrieţi un program care să determine numerele naturale Z
, T
şi K
, unde Z
reprezintă numărul zonei pe care va trebui s-o aleagă Cri astfel încât cantitatea totală T
de grăunţe furate să fie maximă, iar numărul K
de camere prin va trece să fie minim.
Date de intrare
Fișierul de intrare cri.in
conține:
- pe prima linie cele patru numere naturale nenule
N M X Y
, separate prin câte un spaţiu, cu semnificaţia din enunţ - pe fiecare din următoarele
N
linii câteM
numere naturale nenule, separate prin câte un spaţiu, reprezentând cantitatea de grăunţeC
IJ
depozitată în camera de coordonate(I,J)
pentru1 ≤ I ≤ N
şi1 ≤ J ≤ M
.
Date de ieșire
Fișierul de ieșire cri.out
va conține, pe o singură linie, cele trei numere naturale Z
, T
şi K
determinate de program, separate prin câte un spaţiu, în această ordine.
Restricții și precizări
3 ≤ N ≤ 500
;3 ≤ M ≤ 500
2 ≤ X < N
;2 ≤ Y < M
M
,N
,X
şiY
sunt numere naturaleZ
aparține{1,2,3,4}
1 ≤ C
IJ
≤ 8000
(1 ≤ I ≤ N
şi1 ≤ J ≤ M
)C
IJ
sunt numere naturale (1 ≤ I ≤ N
şi1 ≤ J ≤ M
)- Dacă există zone pentru care se obţine aceeaşi cantitate totală maximă
T
de grăunţe şi se trece prin acelaşi număr minimK
de camere, se va alege zona numerotată cu numărul cel mai mic. - Se acordă:
- 20% din punctaj pentru determinarea corectă a numărului
Z
- 40% din punctaj pentru determinarea corectă a numărului
T
- 40% din punctaj pentru determinarea corectă a numărului
K
- 20% din punctaj pentru determinarea corectă a numărului
Exemplu
cri.in
5 4 2 3 1 2 3 33 5 4 3 9 2 13 4 15 1 2 3 3 1 5 2 6
cri.out
2 45 3
Explicație
Camera de pornire are coordonatele (2,3)
, iar N=5
şi M=4
.
Zona 1
conţine camerele de coordonate: (1,1)
, (1,2)
, (1,3)
, (2,1)
, (2,2)
, (2,3)
. Cantitatea maximă de grăunţe pe care o poate fura Cri este 18
trecând prin 6
camere.
Zona 2
conţine camerele de coordonate: (1,3)
, (1,4)
, (2,3)
, (2,4)
. Cantitatea maximă de grăunţe pe care o poate fura Cri este 45
trecând prin 3
camere.
Zona 3
conţine camerele de coordonate: (2,1)
, (2,2)
, (2,3)
, (3,1)
, (3,2)
, (3,3)
, (4,1)
, (4,2)
, (4,3)
, (5,1)
, (5,2)
, (5,3)
. Cantitatea maximă de grăunţe pe care o poate fura Cri este 45
trecând prin 12
camere.
Zona 4
conţine camerele de coordonate: (2,3)
, (2,4)
, (3,3)
, (3,4)
, (4,3)
, (4,4)
, (5,3)
, (5,4)
. Cantitatea maximă de grăunţe pe care o poate fura Cri este 43
trecând prin 7
camere.
Astfel, Cri va intra în zona Z=2
, va fura cantitatea maximă de grăunţe T=45
trecând prin numărul K=3
minim de camere.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Cri:
//prof.Carmen Minca-solutie problema cri - implementare cu tablou bidimensional
#include <stdio.h>
int a[501][501],n,m,nb,mb;
int x,y;
void citire()
{ freopen("cri.in","r",stdin);
scanf("%d%d%d%d",&n,&m,&x,&y);
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
int zona1( int &nr)
{ int i,j,s=0,min=2000000000;
nb=0;
for(i=x; i>=1;i--)
{ nb++; mb=0;
for(j=y;j>=1;j--)
{ mb++;
s=s+a[i][j];
if(((nb+mb)%2!=0)&&(a[i][j]<min))
min=a[i][j];
}
}
nr=nb*mb;
if(mb%2==0 && nb%2==0)
{ nr=nr-1; s=s-min;}
return s;
}
int zona2( int &nr)
{ int i,j,s=0,min=2000000000;
nb=0;
for(i=x; i>=1;i--)
{ nb++; mb=0;
for(j=y;j<=m;j++)
{ mb++;
s=s+a[i][j];
if(((nb+mb)%2!=0)&&(a[i][j]<min))
min=a[i][j];
}
}
nr=nb*mb;
if(mb%2==0 && nb%2==0)
{ nr=nr-1; s=s-min;}
return s;
}
int zona3( int &nr)
{ int i,j,s=0,min=2000000000;
nb=0;
for(i=x; i<=n;i++)
{ nb++; mb=0;
for(j=y;j>=1;j--)
{ mb++;
s=s+a[i][j];
if(((nb+mb)%2!=0)&&(a[i][j]<min))
min=a[i][j];
}
}
nr=nb*mb;
if(mb%2==0 && nb%2==0)
{ nr=nr-1; s=s-min;}
return s;
}
int zona4( int &nr)
{ int i,j,s=0,min=2000000000;nb=0;
for(i=x; i<=n;i++)
{ nb++; mb=0;
for(j=y;j<=m;j++)
{ mb++;
s=s+a[i][j];
if(((nb+mb)%2!=0)&&(a[i][j]<min))
min=a[i][j];
}
}
nr=nb*mb;
if((mb%2==0) && (nb%2==0))
{ nr--; s=s-min;}
return s;
}
int main()
{ int nr,s,k=0,smax=0,ies;
citire();
smax=zona1(k);ies=1;
s=zona2(nr);
if(s>smax){ smax=s; k=nr;ies=2;}
else
if(s==smax)
if(nr<k){k=nr;ies=2;}
s=zona3(nr);
if(s>smax){ smax=s; k=nr;ies=3;}
else
if(s==smax)
if(nr<k){k=nr;ies=3;}
s=zona4(nr);
if(s>smax){ smax=s; k=nr;ies=4;}
else
if(s==smax)
if(nr<k){k=nr;ies=4;}
freopen("cri.out","w",stdout);
printf("%d %d %d",ies,smax,k);
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1064 Cri
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1064 Cri de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!