#4608
aprogressive
Se consideră matricea 𝑇
cu 𝑛
linii (numerotate de la 1
la 𝑛
) și 𝑚
coloane (numerotate de la 1
la 𝑚
) ce conține numere întregi.
O submatrice a matricei 𝑇
este definită prin linia și coloana colțului stânga-sus (𝑥1, 𝑦1)
, respectiv linia și coloana colțului dreapta-jos (𝑥2, 𝑦2)
, cu 1 ≤ 𝑥1 ≤ 𝑥2 ≤ 𝑛
și 1 ≤ 𝑦1 ≤ 𝑦2 ≤ 𝑚
și conține toate elementele de pe pozițiile (𝑥, 𝑦)
ale matricei pentru care 𝑥1 ≤ 𝑥 ≤ 𝑥2
și 𝑦1 ≤ 𝑦 ≤ 𝑦2
. În particular, submatricea cu colțul stânga-sus în (1, 1)
și colțul dreapta-jos în (𝑛,𝑚)
este identică cu matricea 𝑇
.
Pentru fiecare linie a unei submatrice date, se calculează suma pe linie prin adunarea elementelor aflate pe aceasta. Sumele obținute pentru fiecare dintre liniile acestei submatrice formează termenii unui șir, numit șirul 𝑆
al sumelor pe linii. Spunem că submatricea este aprogressive dacă 𝑥1 < 𝑥2
și 𝑦1 < 𝑦2
și șirul 𝑆
al sumelor pe linii poate fi rearanjat pentru a forma, cu toți termenii săi, o progresie aritmetică de rație nenulă 𝑟
.
Forma comprimată a unei submatrice 𝑅
cu colțul stânga-sus (𝑥1, 𝑦1)
și colțul dreapta jos (𝑥2, 𝑦2)
se notează cu C(𝑅)
și se definește astfel:
𝑥1 = 𝑥2
(este o submatrice linie) sau dacă 𝑦1 = 𝑦2
(este o submatrice coloană) atunci forma sa comprimată este C(𝑅)= (𝑥1, 𝑦1, 𝑥2, 𝑦2, 0)
. În caz contrar,𝑅
este aprogressive, forma sa comprimată este C(𝑅)= (𝑥1, 𝑦1, 𝑥2, 𝑦2, 𝑟)
. În caz contrar,𝑅
în 4
submatrice 𝐴
, 𝐵
, 𝐶
, 𝐷
cu mulțimi disjuncte de elemente după cum este ilustrat în figura alăturată, unde submatricea 𝐴
are colțul stânga-sus în (𝑥1, 𝑦1)
, iar colțul dreapta-jos în \( \left( \left[ \frac{x1 + x2}{2} \right], \left[ \frac{y1 + y2}{2} \right] \right) \), \( \left[ x \right] \) reprezentând partea întreagă a numărului real 𝑥
. Forma comprimată a submatricei 𝑅
este definită recursiv C(𝑅) =(C(𝐴), C(𝐵), C(𝐶), C(𝐷))
.Cunoscând dimensiunile și elementele matricei 𝑇
să se determine:
𝑇
pentru care suma elementelor aflate pe fiecare dintre acestea este maximă.𝑇
pentru care elementele pot fi rearanjate astfel încât să formeze pe linia respectivă, o progresie aritmetică de rație nenulă.𝑇
.Problema | aprogressive | Operații I/O |
![]() aprogressive.in /aprogressive.out
|
---|---|---|---|
Limita timp | 0.5 secunde | Limita memorie |
Total: 128 MB
/
Stivă 8 MB
|
Id soluție | #51451128 | Utilizator | |
Fișier | aprogressive.cpp | Dimensiune | 1.21 KB |
Data încărcării | 18 Iunie 2024, 20:28 | Scor / rezultat | Eroare de compilare |
aprogressive.cpp:5:52: error: 'long long int clone [1025][1025]' redeclared as different kind of symbol int a[1025][1025], sp[1025][1025], clone[1025][1025]; ^ In file included from /usr/include/sched.h:41:0, from /usr/include/pthread.h:23, from /usr/include/i386-linux-gnu/c++/4.8/bits/gthr-default.h:35, from /usr/include/i386-linux-gnu/c++/4.8/bits/gthr.h:148, from /usr/include/c++/4.8/ext/atomicity.h:35, from /usr/include/c++/4.8/bits/ios_base.h:39, from /usr/include/c++/4.8/ios:42, from /usr/include/c++/4.8/istream:38, from /usr/include/c++/4.8/fstream:38, from aprogressive.cpp:1: /usr/include/i386-linux-gnu/bits/sched.h:81:12: error: previous declaration of 'int clone(int (*)(void*), void*, int, void*, ...)' extern int clone (int (*__fn) (void *__arg), void *__child_stack, ^ aprogressive.cpp: In function 'int main()': aprogressive.cpp:18:20: warning: pointer to a function used in arithmetic [-Wpointer-arith] clone[i][j]=a[i][j]; ^ aprogressive.cpp:18:23: warning: pointer to a function used in arithmetic [-Wpointer-arith] clone[i][j]=a[i][j]; ^ aprogressive.cpp:18:24: error: assignment of read-only location '*(clone + (((sizetype)i) + ((sizetype)j)))' clone[i][j]=a[i][j]; ^ aprogressive.cpp:18:24: error: cannot convert 'long long int' to 'int(int (*)(void*), void*, int, void*, ...)throw ()' in assignment aprogressive.cpp:36:26: warning: pointer to a function used in arithmetic [-Wpointer-arith] sort (clone[i]+1, clone[i]+m+1); ^ aprogressive.cpp:36:28: warning: pointer to a function used in arithmetic [-Wpointer-arith] sort (clone[i]+1, clone[i]+m+1); ^ aprogressive.cpp:36:38: warning: pointer to a function used in arithmetic [-Wpointer-arith] sort (clone[i]+1, clone[i]+m+1); ^ aprogressive.cpp:36:40: warning: pointer to a function used in arithmetic [-Wpointer-arith] sort (clone[i]+1, clone[i]+m+1); ^ aprogressive.cpp:36:42: warning: pointer to a function used in arithmetic [-Wpointer-arith] sort (clone[i]+1, clone[i]+m+1); ^ aprogressive.cpp: At global scope: aprogressive.cpp:53:1: error: expected declaration before '}' token } ^ In file included from /usr/include/c++/4.8/algorithm:62:0, from aprogressive.cpp:2: /usr/include/c++/4.8/bits/stl_algo.h: In instantiation of 'void std::sort(_RAIter, _RAIter) [with _RAIter = int (*)(int (*)(void*), void*, int, void*, ...)throw ()]': aprogressive.cpp:36:43: required from here /usr/include/c++/4.8/bits/stl_algo.h:5461:22: error: ISO C++ forbids using pointer to a function in subtraction [-fpermissive] std::__lg(__last - __first) * 2); ^
www.pbinfo.ro permite evaluarea a două tipuri de probleme:
Problema aprogressive face parte din prima categorie. Soluția propusă de tine va fi evaluată astfel:
Suma punctajelor acordate pe testele utilizate pentru verificare este 100. Astfel, soluția ta poate obține cel mult 100 de puncte, caz în care se poate considera corectă.