Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Alegere masina £15000 uk

TVR vrea sa lanseze o platforma d...

Strategie investie pe termen lung...

Modulator FM ptr auto alimentat p...
 orange cablu f.o. - internet fara...

Robinet care comuta traseul

A fost lansata Fedora 40

Samsung S24 plus
 Imi iau un Dell? (Vostro vs others)

Abonati Qobuz?

transport -tren

Platforma electronica de eviden&#...
 Cot cu talpa montat stramb in per...

Sfat achizitie sistem audio pentr...

tavan fals rigips

Ce preferați: produse mai scumpe ...
 

Lungime maxima secventa descrescatoare intr-o lista simplu inlantuita

- - - - -
  • Please log in to reply
14 replies to this topic

#1
Cognitivul

Cognitivul

    Junior Member

  • Grup: Junior Members
  • Posts: 55
  • Înscris: 27.07.2017
Salut!Am incercat astazi sa rezolv o problema,doar ca fara foarte mare progres.Enunt:Se da o lista simplu inlantuita(o aloc dinamic).Trebuie sa scriu o functie care imi printeaza indicii de inceput si de sfarsit ale secventei de lungime maxima ,descrescatoare (daca sunt 2 astfel de secvente,o printez pe prima).
   Exemplu:
4,2,3 ,  4   ,6  , 5,   -10,   2 ,  1,   0

   Se printeaza indicii 5 si 7 intrucat prima si cea mai mare secventa descrescatoare este "6 , 5 , -10" ;

Ma gandesc ca trebuie sa parcurg lista.
Daca  Exista L->urm si L-info < L->urm->info


void IndiciSecvMaxDesc(TLista L )  //TLista e o structura ; Celula de lista are campul "info" , un int si campul adresa "urm".
{   int poz=0,inc=1,sf=1,lungime=1;
for( ; L!=NULL ; L=L->urm ) //parcurgere lista
{  poz++;
if(L-urm != NULL)
   if(L->info < L->urm->info) // ordine crescatoare si trebuie reactualizat indice inceput.
/* acum nu stiu cat de departe sa ma duc si cum sa gasesc lungimea maxima a secventei */
}   
}


Multumesc pentru ajutor!

Edited by Cognitivul, 22 March 2019 - 20:34.


#2
Cognitivul

Cognitivul

    Junior Member

  • Grup: Junior Members
  • Posts: 55
  • Înscris: 27.07.2017
Programul trebuie facut doar in C si cum as putea sa ordonez lista ?Daca puteam folosi vectori,era usor.Doar ca nu stiu cum sa ma descurc cu legaturile.Trebuie sa folosesc doar Liste Simplu Inlantuite.

Edited by Cognitivul, 22 March 2019 - 21:03.


#3
ccdsah

ccdsah

    Senior Member

  • Grup: Senior Members
  • Posts: 2,581
  • Înscris: 16.03.2013

 BraviaAmpero, on 22 martie 2019 - 20:52, said:

-10 0 1 2 3 4 4 5 6  
7 10 9 8 3 1 4 6 5
Sirul de indicii este imaginea transformata (codomeniu) sirului de numere (domeniu) prin ordonarea crescatoare(transformare) al  domeniului.

Astfel, 5 si 7 sunt indicii captelor de interval al imaginei transformate.

Iti poti crea un map de  perechi de tipul (x,y) unde x = valoare, y=indecs al valorii, si apoi ordonezi crescator hash-mapul dupa cheile  mapului(adica valorile de x) si apoi scoti prima si ultima valoare din valorile  map-ului

Map-ul trebuie sa definit conform prototipului : Map<Key, List<Value>> (doarece am observat ca poti avea chei duble)

Daca vrei poti sa mergi pe expresii lambda, din cate am vazut ca C++ a inceput sa suporte(intr-un final)acest lucru
https://en.cpprefere...language/lambda
Nu trebuie sa ordonezi crescator sirul. Problema se rezolva in O(n) cu o singura parcurgere a sirului

#4
_bcristian_

_bcristian_

    Senior Member

  • Grup: Senior Members
  • Posts: 3,569
  • Înscris: 31.12.2006
Tii inceputul si lungimea celei mai lungi secvente gasite pana acum, respectiv cea curenta, precum si (pointerul la) elementul anterior. Initial sunt ambele zero, unu, si primul element.
Parcurgi lista, incepand cu al doilea element.
Daca e mai mic decat cel de dinainte sau ai ajuns la capatul listei, incrementezi lungimea secventei curente.
Altfel, secventa curenta s-a terminat. Daca e mai lunga decat cea mai lunga de pana acum, copiezi acolo valorile. Resetezi lungimea secventei curente.
Cand ajungi la capatul listei ai raspunsul.
Comparatia include egalitatea, daca secventele nu trebuie sa fie _strict_ descrescatoare.

#5
Cognitivul

Cognitivul

    Junior Member

  • Grup: Junior Members
  • Posts: 55
  • Înscris: 27.07.2017
Problema trebuie rezolvata doar cu Liste Simplu Inlantuite fara alocari statice de memorie.
Ideea e ca stiu sa fac parcurgerea.Pseudocodul,sa zic,nu mi-ar fi clar.

Multumesc,incerc acum.

Edited by Cognitivul, 22 March 2019 - 21:21.


#6
Cognitivul

Cognitivul

    Junior Member

  • Grup: Junior Members
  • Posts: 55
  • Înscris: 27.07.2017

 _bcristian_, on 22 martie 2019 - 21:19, said:

Tii inceputul si lungimea celei mai lungi secvente gasite pana acum, respectiv cea curenta, precum si (pointerul la) elementul anterior. Initial sunt ambele zero, unu, si primul element.
Parcurgi lista, incepand cu al doilea element.
Daca e mai mic decat cel de dinainte sau ai ajuns la capatul listei, incrementezi lungimea secventei curente.
Altfel, secventa curenta s-a terminat. Daca e mai lunga decat cea mai lunga de pana acum, copiezi acolo valorile. Resetezi lungimea secventei curente.
Cand ajungi la capatul listei ai raspunsul.
Comparatia include egalitatea, daca secventele nu trebuie sa fie _strict_ descrescatoare.
superb pseudocodu !A mers.Multumesc mult!

#7
BraviaAmpero

BraviaAmpero

    Member

  • Grup: Members
  • Posts: 923
  • Înscris: 03.11.2018
ia pune aici codul sursa rezulat.Sunt foarte curios ce ai inteles si "ce a mers".

#8
Cognitivul

Cognitivul

    Junior Member

  • Grup: Junior Members
  • Posts: 55
  • Înscris: 27.07.2017
Multumesc pentru ajutor!

void PozIncFinSecvPoz(TLista L)
{
	int incmax, sfmax, l, max = 0;
	int poz = 1, inc = 1, sf = 1;
	TLista p = L;
	if (L != NULL) {
		if (L->urm != NULL)
			L = L->urm;
	}
	for (; L != NULL; L = L->urm) {
		poz++;
		if (p->info > L->info) {
			sf = poz;
			l = sf - inc + 1;
			if (l > max) {
				incmax = inc;
				sfmax = sf;
				max = l;
			}
		}
		if (p->info < L->info) {
			inc = poz;
		}
		p = p->urm;
	}

	printf("\n%d %d\n ", incmax, sfmax);
}


Edited by dani.user, 24 March 2019 - 10:47.
ne place sa citim cod formatat


#9
BraviaAmpero

BraviaAmpero

    Member

  • Grup: Members
  • Posts: 923
  • Înscris: 03.11.2018
pune si declaratia tipului TLista

Edited by BraviaAmpero, 23 March 2019 - 23:24.


#10
BraviaAmpero

BraviaAmpero

    Member

  • Grup: Members
  • Posts: 923
  • Înscris: 03.11.2018
Congnitivule este o problema: nu se printeaza indecsii 5 si 7 ,conform sirului dat initial:
Avem lista :
valoare_nod=4
valoare_nod=2
valoare_nod=3
valoare_nod=4
valoare_nod=6
valoare_nod=5
valoare_nod=-10
valoare_nod=2
valoare_nod=1
valoare_nod=0

ia uite ce se intampla in solutia data de tine (in bucla for), da click pe poza pt marire:
Attached File  cognitivul.PNG   3.97K   4 downloads
Orit tu ai zis ca este absolut perfect, insa indecsii ies ca 6 si 8.
Poti te rog sa clarifici aceste diferente?

2.Esti absolut sigur ca virgula codul sursa de tine la sfarsit sigur se compileaza in C ?

Edited by BraviaAmpero, 24 March 2019 - 00:22.


#11
BraviaAmpero

BraviaAmpero

    Member

  • Grup: Members
  • Posts: 923
  • Înscris: 03.11.2018
LE: ti-am atasat si variatia valorilor nodurilor in bucla for:
Attached File  cognitivul.PNG   5.48K   5 downloads

#12
Cognitivul

Cognitivul

    Junior Member

  • Grup: Junior Members
  • Posts: 55
  • Înscris: 27.07.2017
Da sunt sigur ! Eu in C l-am compilat.
Cat despre pozitie, primul elelement din lista are pozitia 1.Daca se presupune ca primul element are pozitia 0,atunci int poz=0 ( pe al doilea rand);

#13
BraviaAmpero

BraviaAmpero

    Member

  • Grup: Members
  • Posts: 923
  • Înscris: 03.11.2018
ia pune aici tot codul, absolut tot codul.

#14
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 BraviaAmpero, on 24 martie 2019 - 11:48, said:

ia pune aici tot codul, absolut tot codul.
Asa i-am cerut si pe https://forum.softpe...plu-inlantuite/ si a ignorat. Am impresia ca trolleaza.

#15
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Cine vrea sa exerseze C++ e invitat sa vina cu o solutie generica la aceasta problema, solutie ce ar functiona cu orice forward iterator si mod de comparare.

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate