O piscină dreptunghiulară de metri lungime pe metri lățime este împărțită în zone de . O astfel de zonă are aceeași adâncime pe toată suprafața ei de , dar două zone diferite pot avea adâncimi diferite. Adâncimile zonelor, exprimate în metri (), sunt numere naturale nenule și sunt salvate într-o matrice cu linii și coloane.
Din cauza restricțiilor constructive ale piscinei, matricea trebuie să fie bine definită, în sensul în care pentru toate submatricele de dimensiune formate din linii consecutive și coloane consecutive ale matricei , numerele aflate pe oricare dintre cele două diagonale nu sunt amândouă mai mici decât fiecare dintre celelalte două elemente. În conformitate cu legile fizicii, dacă o zonă din piscină conține apă, apa tinde să se distribuie în zonele adiacente pe verticală și orizontală care au adâncimea sub nivelul apei.
Proprietarul vrea să economisească apă. Ținând cont de cererea din partea publicului, nu are nevoie să umple neapărat toată piscina, ci cel puțin o suprafață dreptunghiulară cu zone în lungime și zone în lățime, unde și . Suprafața umplută cu apă poate fi situată oriunde în piscină. Adâncimea apei pe suprafața umplută trebuie să fie de cel puțin în fiecare punct. Proprietarul vrea să afle , cantitatea minimă de apă necesară în acest scop.
De exemplu, pentru piscina reprezentată în matricea de mai jos și , sunt necesari de apă, iar suprafața acoperită este dată de cele zone a căror adâncime este scrisă colorat.
Cerință
Scrieți în sau în :
- o funcție
verifica
, cu parametrii , , , care determină dacă este bine definită în sensul de mai sus (funcția întoarce sau ; presupuneți că conține doar numere naturale nenule); - o funcție
complet
, cu parametrii , , , care întoarce cantitatea de apă necesară pentru a umple toată piscina cu apă de adâncime cel puțin (nu validați datele de intrare); - o funcție
optim
, cu parametrii , , și , care întoarce , cantitatea minimă de apă necesară (nu validați datele de intrare).
Antetele funcțiilor descrise mai sus sunt acestea:
bool verifica(int A[101][101], int N, int M);
int complet(int A[101][101], int N, int M);
int optim(int A[101][101], int N, int M, int K);
Restricții și precizări
- Este garantat că suma elementelor matricei este .
- Matricea este indexată de la .
- Distribuția punctajelor în ordinea cerințelor este . În concurs a fost .
- Atenție! Cerința este să implementați cele 3 funcții descrise în enunț. Sursa pe care o veți trimite nu va conține funcția
main
! Iată un exemplu de sursă validă:
#include <algorithm>
using namespace std;
bool verifica(int A[101][101], int N, int M) {
return 0;
}
int complet(int A[101][101], int N, int M) {
return A[1][1];
}
int optim(int A[101][101], int N, int M, int K) {
return *max_element(A[1] + 1, A[1] + M+1);
}