Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
[TEMA]Cea mai mare diferenta in modul
Last Updated: Feb 11 2016 21:18, Started by
mojonono
, Feb 11 2016 15:08
·
0
#1
Posted 11 February 2016 - 15:08
Se citeşte un şir de n numere întregi de la tastatură. Să se determine perechea de valori consecutive din şir care au diferenţa în modul maximă.
Ex: n=7 2, 17, 8, 21, 31, 40, 33 Rezultat: Cea mai mare diferenţă în modul este între valorile consecutive 2, 17 şi este egală cu 15. Daca introduc n=3, si apoi 10 2 0, Imi afiseaza 10 si 0. #include <iostream> #include <cmath> using namespace std; int main() { int n,i,a[20],maxim=0,x,y; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } for(i=1;i<=n;i++) if(abs(a[i]-a[i-1]>maxim)) { maxim=abs(a[i]-a[i+1]); x=a[i]; y=a[i-1]; } if((abs(a[1]-a[n]>maxim))) { x=a[1]; y=a[n]; } cout<<x<<' '<<y; return 0; } Edited by mojonono, 11 February 2016 - 15:09. |
#3
Posted 11 February 2016 - 15:24
Dacă începi cu i de la 1, atunci i-1 ce valoare are? Și ce se află pe acea poziție din a? Dacă termini când i este n, atunci i+1 ce valoare are? Și ce se află pe acea poziție din a? De ce pe o linie folosești i-1 și pe linia următoare i+1?
|
#4
Posted 11 February 2016 - 15:25
O întrebare simplă: De ce folosești un vector ? De ce sacrifici 20 * sizeof(int) ?
Un vector îl folosești când vrei să salvezi ceva în memorie. Te pune cineva să salvezi valorile citite ? Nu. Îți spune doar să evaluezi o diferență amărâtă și afișezi acei 2 termeni ai șirului pt. care această diferență amărâtă în modul e maximă. Ceva trebuie să salvezi, dar în niciun caz nu ai nevoie de 20*sizeof(int) ... Gândește-te că pot veni cu 20000000 de numere.... Edited by Rhesus, 11 February 2016 - 15:31. |
#5
Posted 11 February 2016 - 15:31
de fapt intrebari simple sunt cele puse de tavitu . la nivelul asta cu te gandesti la optimizari?
|
#6
Posted 11 February 2016 - 15:37
Acuma am citit mai atent codul (in prima faza am abandonat cititul dupa declararea vectorului).
if(abs(a[i]-a[i-1]>maxim)) { maxim=abs(a[i]-a[i+1]); Daca diferenta dintre 17 si 2 (adica 15) este mai mare decat maxim, atunci maxim este diferenta dintre 17 si 8. Interesanta abordare ...... Explica te rog si: if((abs(a[1]-a[n]>maxim))) { x=a[1]; y=a[n]; } cout<<x<<' '<<y; Primul element (care corect ar fi a[0]) - ultimul element a[n-1] ... Ce treaba are 7 cu 33 ? Sunt in capete opuse. Sunt consecutive? E f. simpla problema (ia-o logic). Citesc primele 2 numere. Fac diferenta absoluta. Presupun ca e maxima. Salvez cele 2 elemente. Merg mai departe. Fac diferenta absoluta. E mai mare decat maxima ? Daca da, actualizez maxima si cele 2 elemente, daca nu merg mai departe. 3 randuri de cod. Daca depasesti 10 randuri de cod, ai luat-o pe calea gresita. Edited by Rhesus, 11 February 2016 - 15:53. |
#7
Posted 11 February 2016 - 16:06
Rhesus, on 11 februarie 2016 - 15:37, said:
Acuma am citit mai atent codul (in prima faza am abandonat cititul dupa declararea vectorului). if(abs(a[i]-a[i-1]>maxim)) { maxim=abs(a[i]-a[i+1]); Daca diferenta dintre 17 si 2 (adica 15) este mai mare decat maxim, atunci maxim este diferenta dintre 17 si 8. Interesanta abordare ...... Explica te rog si: if((abs(a[1]-a[n]>maxim))) { x=a[1]; y=a[n]; } cout<<x<<' '<<y; Primul element (care corect ar fi a[0]) - ultimul element a[n-1] ... Ce treaba are 7 cu 33 ? Sunt in capete opuse. Sunt consecutive? E f. simpla problema (ia-o logic). Citesc primele 2 numere. Fac diferenta absoluta. Presupun ca e maxima. Salvez cele 2 elemente. Merg mai departe. Fac diferenta absoluta. E mai mare decat maxima ? Daca da, actualizez maxima si cele 2 elemente, daca nu merg mai departe. 3 randuri de cod. Daca depasesti 10 randuri de cod, ai luat-o pe calea gresita. for(i=1;i<=n;i++) if(abs(a[i]-a[i+1])>maxim) { maxim=abs(a[i]-a[i+1]); x=a[i]; y=a[i+1]; } |
#8
Posted 11 February 2016 - 16:19
Rhesus, on 11 februarie 2016 - 15:25, said:
O întrebare simplă: De ce folosești un vector ? De ce sacrifici 20 * sizeof(int) ? Un vector îl folosești când vrei să salvezi ceva în memorie. Te pune cineva să salvezi valorile citite ? Nu. Îți spune doar să evaluezi o diferență amărâtă și afișezi acei 2 termeni ai șirului pt. care această diferență amărâtă în modul e maximă. Ceva trebuie să salvezi, dar în niciun caz nu ai nevoie de 20*sizeof(int) ... Gândește-te că pot veni cu 20000000 de numere.... Presupunand dupa cum scrie codul ca e in liceu , atunci nu are treaba cu memoria si cu timpul de executie , sau cu cazul cand se citesc 109 numere . Uita-te , a citit vectorul de la 1 la n. @ initiator citesti vectorul de la 0 la n-1 si apoi faci ce a zis Rhesus . nu ai nevoie sa folosesti vector for(i=1;i<=n;i++) {cin>>a ; ...... afisezi # am editat acum . am crezut ca ii cere diferenta dintre oricare doua ) Edited by VladBtz, 11 February 2016 - 16:28. |
#9
Posted 11 February 2016 - 16:20
Mergi doar pana la n-1 ca-ti iese din vector.
@VladBtz Te complici. Vei ca j-ul pleaca de la i+1. Ai O(n2) acolo. Merge cu o singura parcurgere. Edited by aLexCM, 11 February 2016 - 16:24. |
#10
Posted 11 February 2016 - 16:22
@Vlad. Ce-ai facut tu acolo n-are nici un sens. Maxim modulul diferentei = max-min. Nu trebuie 2 parcurgeri. In plus, cerinta spune numere pe pozitii consecutive.
|
|
#11
Posted 11 February 2016 - 16:32
VladBtz, on 11 februarie 2016 - 16:19, said:
Presupunand dupa cum scrie codul ca e in liceu , atunci nu are treaba cu memoria si cu timpul de executie , sau cu cazul cand se citesc 109 numere . Uita-te , a citit vectorul de la 1 la n. @ initiator citesti vectorul de la 0 la n-1 si apoi faci ce a zis Rhesus . nu ai nevoie sa folosesti vector for(i=1;i<=n;i++) {cin>>a ; ...... afisezi # am editat acum . am crezut ca ii cere diferenta dintre oricare doua ) Pai trebuie sa folosesc vector. Nu inteleg de ce nu e bine asa Fac diferenta,o atribui lui maxim,x devine primul element si y al doilea. for(i=0;i<n-1;i++) if(abs(a[i]-a[i+1])>maxim) { maxim=abs(a[i]-a[i+1]); x=a[i]; y=a[i+1]; } |
#12
Posted 11 February 2016 - 16:43
E bine. Vezi sa citesti vectorul tot de la 0.
for(i=0;i<n;i++) cin>>a[i]; |
#13
Posted 11 February 2016 - 17:06
Nu trebuie sa folosesti vector. Lasa tampeniile pe care ti le spune profesorul la clasa. Gandeste in felul tau problema!
Nu te limita la liceu, sau la cum ati facut la clasa. Rezolva problema asa cum crezi tu de cuviinta. Incearca sa rezolvi problema cat mai eficient, chiar daca nu-ti cere nimeni. Initializeaza maxim cu -1. De ce nu cu 0 ? Astept raspunsul. Hint: Vezi cazul: 17 17 17 17 17 17 17 cu x si y neinitializati si cu maxim initializat cu 0 (nu cu -1). Ce se intampla? int nr_elemente, maxim, current, next, elem1, elem2, dif; cin >> nr_elemente >> current; // citesc nr. elemente, precum si pe primul element maxim = -1; // initializez maxim cu -1 (pt. a evita cazul 17 17 17 17 17 ...) for (int i=0; i<nr_elemente-1; i++){ cin >> next; // citim urmatorul element dif = abs(current-next); // calculam diferenta ca sa nu apelam de doua ori abs if (dif>maxim){ // daca diferenta este mai mare decat maxim maxim = dif; // actualizam noul maxim elem1 = current; // precum si primul elem2 = next; // si al doilea element } current = next; // noi intotdeauna citim next, deci actualizam current pt. un viitor ciclu } Scuze de indentare, e facut pe ideone.com iar copy-paste-ul e bullshit. Aloci in memorie 8 * sizeof(int) adica, 32 de bytes. Dacă ai avea nr_elemente 1 milion, și ai vrea să salvezi într-un vector 1 milion de numere, ai avea nevoie de 4MB... Edited by Rhesus, 11 February 2016 - 17:30. |
#14
Posted 11 February 2016 - 21:18
ce vrea @Rhesus sa spuna este ca problema asta se rezolva la citire
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users