Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
Suma maxima.
Last Updated: Oct 06 2022 22:52, Started by
Irbaa
, Oct 04 2022 13:16
·
0
#1
Posted 04 October 2022 - 13:16
Salut. Am rezolvat o problema insa aparent nu este intocmai rezolvata si nu pot sa imi dau seama unde gresesc.Enuntul problemei suna cam asa:"Se dă o matrice m cu n linii și n coloane. Să se afișeze suma maximă a elementelor situate pe o paralelă la diagonala principală sau secundară."
Ca restrictii avem: "1 ≤ n ≤ 50 -100 ≤ m[i][j] ≤ 100 Diagonalele principale și secundare se consideră și ele paralele" Iar eu am rezolvato in felul urmator : #include <iostream> using namespace std; int main() { int n , m[50][50]; cin >> n; for(int i = 1; i <= n; ++i){ for(int j = 1; j <= n; ++j){ cin >> m[i][j]; } } int max = -100; for(int i = -n + 1; i <= 0; ++i){ int s = 0; for(int j = 1; j <= n + i; ++j){ s = s + m[j][j - i]; } if (s >= max){ max = s; } } for(int i = 1; i <= n - 1; ++i){ int s = 0; for(int j = 1; j <= n - i; ++j){ s = s + m[j + i][j]; } if(s >= max){ max = s; } } cout << max; }Practic trebuie determinata diagonala de suma maxima, nu?Daca da, nu vad unde gresesc. Ps: Am determinat suma diagonalelor secundare la diagonala principala. |
#2
Posted 04 October 2022 - 14:38
In C/C++ indicii matricilor cred ca pleaca de la 0, nu de la 1.
|
#3
Posted 04 October 2022 - 15:12
#4
Posted 04 October 2022 - 16:13
Quote Să se afișeze suma maximă a elementelor situate pe o paralelă la diagonala principală sau secundară. Adica vrea sa calculezi sumele pe toate paralele si sa afisezi doar suma maxima. E o matrice patratica cu maxim 50 de elemante pe linie si cu elementele intre -100 si 100,. Deci e despre diagonala si patratica, asa ca nu lucrezi cu ij ci doar cu i, e vorba de diagonale si elementele au forma i,i pt principala sau n-i, i pt secundara. Paralele au forme asemanatoare. Diagonalele impart fiecare matricea in doua zone care au forme diferite, deci vei avea patru situatii, deasupra si sub fiecare diagonala. Fiecare zona are cate n-1 Incepi cu care vrei, prima paralela calculata o iei de buna si o inlocuiesti doar daca gasesti alta cu suma mai mare. Pentru depanare pui sa afiseze elementele pe care le calculeaza. Edited by Lexon, 04 October 2022 - 16:15. |
#5
Posted 04 October 2022 - 16:14
1 Intr-adevar, asa cum a explicat @crios339, in C/C++ indecsii pleaca de la zero; deci daca ai declarat int m[50][50] => indecsii sunt intre 0 si 49. Insa: daca tu ai considerat ca indecsii pleaca de la 1 si ai scris algoritmul corect cf. acestei presupuneri, ar trebui sa functioneze. Singura problema pe care s-ar putea sa o ai este un "Segmentation fault" pentru n=50 deoarece vei incerca sa accesezi memoria nealocata m[i][50] si m[50][j].
2 O matrice n x n are 2n-1 diagonale paralele cu una din diagonale si 2n-1 diagonale paralele cu cealalta => total = 4n-2 sume. Din cate observ, tu calculezi doar 2n-1 sume, deci doar jumatate din numarul necesar de sume. 3 Cand i = - n + 1 si j = 2 => m[j][j - i] = m[ 2 ][ 2 - (- n + 1) ] = m[ 2 ][ 2 + n - 1] = m[ 2 ][ n + 1 ] => incerci sa accesezi coloana (n + 1) care nu exista; probabil ca trebuia sa fie (n - 1)... |
#6
Posted 04 October 2022 - 16:31
4 E greu pentru cineva (probabil chiar si pentru tine) sa inteleaga ce fac exact for-urile alea...
#define main_diag_col(diag_id, row) (diag_id + row) #define main_diag_min_row(diag_id) (diag_id < 0 ? - diag_id : 0) #define main_diag_max_row(diag_id) (diag_id <= 0 ? n - 1 : n - diag_id - 1) [ In expresiile de mai sus, fiecare identificator trebuie pus intre paranteze (le-am omis de dragul claritatii), altfel rezultatele nu sunt cele asteptate.... ] Am numerotat diagonalele paralele cu cea principala astfel: - diag_id = -(n-1) pentru cea mai indepartata de sub diagonala principala - diag_id = 0 pentru diagonala principala - diag_id = +(n-1) pentru cea mai indepartata de deasupra diagonalei principale. Primul macro intoarce coloana celulei de pe diagonala diag_id si linia row. Al doilea macro intoarce linia minima de pe diagonala diag_id. Al treilea marco intoarce linia maxima de pe diagonala diag_id. Cu aceste 3 macro-uri, codul devine mai usor de inteles: for (int diag_id = -(n-1); diag_id <= (n-1); diag_id++) for (int i = main_diag_min_row(diag_id); i <= main_diag_max_row(diag_id); i++) s += m[ i ][ main_diag_col(diag_id, i) ] Aceeasi abordare se poate folosi si pentru diagonala secundara, regula acolo fiind ca suma dintre linie si coloana este constanta (pentru o diagonala data). Edited by darkangel2, 04 October 2022 - 16:35. |
#7
Posted 04 October 2022 - 18:38
"3 Cand i = - n + 1 si j = 2 => m[j][j - i] = m[ 2 ][ 2 - (- n + 1) ] = m[ 2 ][ 2 + n - 1] = m[ 2 ][ n + 1 ] => incerci sa accesezi coloana (n + 1) care nu exista; probabil ca trebuia sa fie (n - 1)..."
Cand j = 2 , i = -n + 2, fiindca deja trece o data prin al doilea for... sa presupunem ca n = 4 , avem : i = -4 + 1 = -3 .. al doilea for fiind for(int j = 1; j <= n+i ; ++j) avem m[1][1 - (-3)] => m[1][4]. iar n + i = 4 +(-3) = 1. Deci iesim din for si ajungem la primul for unde i = -3 + 1 = -2 , avem m[1][1 + 2] si m[2][2 + 2] iar n + i = 4 - 2 = 2... for ul va rula de exat doua ori. Multumesc pentru raspunsuri, am sa calculez toate digonalele si am sa revin cu implementarea sau cu vestea ca am reusit sa trec de problema. |
#8
Posted 04 October 2022 - 21:50
Irbaa, on 04 octombrie 2022 - 18:38, said:
"3 Cand i = - n + 1 si j = 2 => m[j][j - i] = m[ 2 ][ 2 - (- n + 1) ] = m[ 2 ][ 2 + n - 1] = m[ 2 ][ n + 1 ] => incerci sa accesezi coloana (n + 1) care nu exista; probabil ca trebuia sa fie (n - 1)..." Ignora asta - n-am vazut ca j <= n + i, deci cand i = - n + 1 => j <= 1 => j nu poate fi 2! |
#9
Posted 05 October 2022 - 07:38
Irbaa, on 04 octombrie 2022 - 18:38, said:
Multumesc pentru raspunsuri, am sa calculez toate digonalele si am sa revin cu implementarea sau cu vestea ca am reusit sa trec de problema. Faptul ca treci peste probelama este irelevant daca n-ai invatat nimic. Edited by MarianG, 05 October 2022 - 07:39. |
#10
Posted 05 October 2022 - 07:57
darkangel2, on 04 octombrie 2022 - 16:31, said: [ In expresiile de mai sus, fiecare identificator trebuie pus intre paranteze (le-am omis de dragul claritatii), altfel rezultatele nu sunt cele asteptate.... ] #define main_diag_col(diag_id, row) (diag_id + row) #define main_diag_min_row(diag_id) (diag_id < 0 ? - diag_id : 0) #define main_diag_max_row(diag_id) (diag_id <= 0 ? n - 1 : n - diag_id - 1) |
|
#11
Posted 05 October 2022 - 19:21
Se pare ca simpla calculare a sumei elementelor tuturor paralelelor celor doua diagonale nu este bine.
|
#13
Posted 06 October 2022 - 13:32
Fiindca este suficient sa fac suma tuturor paralelelor la una din cele doua diagonale si trebuie sa cuprind toate cazurile in care matricea are elementele nu mai mari decat 100 si nu mai mici decat -100. Se pare ca imi scapa anumite cazuri. Si nu pot sa imi dau seama ce poate exista inafara de cele 3 situatii pe care pe care am testat programul. Situatia in care toate elementele matricii sunt negative, situatia cand toate elementele sunt pozitive si situatia cand elementele sunt si negative si pozitive.
|
#14
Posted 06 October 2022 - 14:23
Irbaa, on 06 octombrie 2022 - 13:32, said:
Situatia in care toate elementele matricii sunt negative, situatia cand toate elementele sunt pozitive si situatia cand elementele sunt si negative si pozitive. Ai prezentat 3 situatii. In ce fel sunt diferite aceste situatii din punct de vedere al operatiei de adunare algebrica? De exemplu: care este diferenta (din punct de vedere al algoritmului), intre adunarea numerelor 1 + 2 si adunarea numerelor (-1) + (-2)? Nu este tot o adunare? |
#15
Posted 06 October 2022 - 14:43
Poi, aceste 3 situatii inglobeaza suma posibilitatilor pe care eu le vad in aceasta problema si anume : a + b , -a + (-b) si -a + b.
|
|
#16
Posted 06 October 2022 - 14:55
Irbaa, on 06 octombrie 2022 - 14:43, said:
a + b , -a + (-b) si -a + b Toate aceste 3 situatii sunt, de fapt, una singura: a + b. Eu zic ca rezultatul a + b este corect indiferent daca: a si b sunt pozitive, negative, unul negativ si altul pozitiv, mai mari decat 15, mai mici decat 3, pare, impare, multiplii de 13 etc. Este o singura situatie, nu sunt mai multe... Edited by darkangel2, 06 October 2022 - 14:55. |
#17
Posted 06 October 2022 - 15:20
Ok, rectific... Am identificat o singura situatie de care am nevoie sa rezolv problema asta si nu vad altele inafara de asta.
Edited by Irbaa, 06 October 2022 - 15:20. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users