Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Info Coronavirus/Vaccinare vs Fake News

Schema RR Gloria 1-2-3 cu rezolut...

Windows 10 sau alta aplicatie fol...

Motocoasa pe acumulatori erbauer
 Aplicare la concurs pe un post AN...

Infecție care tot reapare

telefon copil - 1200 -1300 lei

Whatsapp web pe pc
 Sfat achizitionare un laptop din ...

Ce este si la ce foloseste?

Buton pornire Esprimo E5645 d2984

Recomandare HDD
 Nesebar

Problema ecran ASUS ROG Strix G15...

MONITOR 27' Viewsonic 27"...

Preschimbare permis auto
 

Eliminarea primului element dintr-un sir.

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

#1
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 43
  • Înscris: 15.03.2022
Este posibil sa eliminam primul element dintr-un sir fara sa mutam toate elementele sirului cu o pozitie spre dreapta?
Trebuie sa existe o solutie mai simpla decat asta :
#include <iostream>
using namespace std;
int main() {
int n , v[100];
cin >> n;
for(int i = 1; i <= n; ++i){
	 cin >> v[i];
	
}
for (int i = 1; i <= n; ++i){
	 v[i] = v[i + 1];
}
--n;

for (int i = 1; i <= n; ++i){
	 cout << v[i] << " ";
}
return 0;
}


Edited by Irbaa, 19 May 2022 - 14:09.


#2
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 39,392
  • Înscris: 30.07.2003
Pointeri. Da-i ca adresa elementul doi si asa ai un vector fara primul element. Si ai grija la parcurgere ca e mai scurt, altfel umbli creanga prin memorie.

Edited by neagu_laurentiu, 19 May 2022 - 14:19.


#3
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 43
  • Înscris: 15.03.2022
Oare se poate realiza aceasta operatie decat cu "for" si/sau "while" ? Eu m-am gandit initial sa inversez valoarea primei pozitii cu valoarea celei de a doua si sa elimin ultima pozitie , dar pe urma imi dau peste cap ordinea sirului.
Sau sa inversez toate valorile si sa elimin ultima pozitie dar asta presupune mai multe operatii decat metoda initiala.

#4
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 39,392
  • Înscris: 30.07.2003
In ce clasa esti de n-ai inteles ce am zis mai sus? Echivalent cu a folosi i ca fiind i+1. Sau o functie care returneaza indexul modificat,.
Vezi ca in C indexul pleaca de la 0 si nu 1, asa ca ai grija la final.

Edited by neagu_laurentiu, 19 May 2022 - 14:53.


#5
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 43
  • Înscris: 15.03.2022
Bun, te- am inteles. Dar daca trebuie sa fac asta in mod repetat, cum fac? Adica sa presupunem ca avem un sir , iar asupra acelui sir vreau sa efectuez urmatoarele operatii: Vreau sa elimin prima pozitie din sir cand voi introduce tasta 1 sau sa adaug un nou numar la final cand voi introduce tasta 2. Din cate am inteles , ce imi zici tu este sa ignor pur si simplu prima pozitie a sirului si sa afisez sirul fara ea. Corect?

Edited by Irbaa, 19 May 2022 - 15:08.


#6
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 39,392
  • Înscris: 30.07.2003
Da. Insa asta a fost cerinta.

#7
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 43
  • Înscris: 15.03.2022
Probabil nu m-am exrpimat suficient de bine , dar eu vreau sa elimin primul element al sirului cu tot cu pozitie.

#8
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 39,392
  • Înscris: 30.07.2003
Pe o alocare statica (int  v[100]; ) nu poti. E batut in cuie spatiul asta. Poti doar sa te joci cu elementele index in asa fel sa para ca stergi/adaugi. Altfel trebuie alocare dinamica, pointeri, liste etc.

Edited by neagu_laurentiu, 19 May 2022 - 15:34.


#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 28,916
  • Înscris: 24.02.2007
Ai informatia in memorie, dar ce vrei sa faci cu ea? Tii neaparat sa modifici ordinea/pozitia elementelor in memorie? Vei fi obligat s-o faci... Vrei insa doar sa afisezi/faci aproape orice cu toate elementele mai putin primul? Ignori primul element.

#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 27,460
  • Înscris: 10.08.2005

View PostIrbaa, on 19 mai 2022 - 15:30, said:

Probabil nu m-am exrpimat suficient de bine , dar eu vreau sa elimin primul element al sirului cu tot cu pozitie.
imagieneaza-ti un metru de tamplar, are 100 de centimetri,
daca elimini primul centimetru, gradat intre 0  si 1, ramaii cu 99 de centimenetri, de la 1 pana la 100.
doar ca acum primul centimetru o sa fie gradat intre 1 si 2

pozitia este relativa fata de inceputului sirului,
pozitia 0 inseamna ca ne-am indepartat 0 unitati (intregi) fata de pozitia de start

partea cu adaugatul unui numar nou la final este mai complcata, pentru ca nu ai drept de lucru asupra acelei memorii
poti sa rescrii pozitiile pe care le-ai ignorat si sa le afisezi la final
for ( pozitie = 5; pozitie < 105; pozitie++ ) afiseaza sir [ pozitie % 100 ] ; 

for(int i = 1; i <= n; ++i){
		 cin >> v[i];
	   
}
for (int i = 1; i <= n; ++i){
		 v[i] = v[i + 1];
}
repetam, special pentru tine
indexarea porneste de la 0;
bucla for trebuie sa opreasca cand indexul este cu numarul de elemente, astfel sa nu accesam pozitia urmatoare "ultimei pozitii",
tu nu doar ca faci asta, dar mergi inca un pas
pentru n = 100; i = i+1 rezuulta i=101;
v[99] | v[100] | v[101]

Edited by MarianG, 19 May 2022 - 17:02.


#11
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 19,019
  • Înscris: 24.02.2006

View PostIrbaa, on 19 mai 2022 - 14:08, said:

Este posibil sa eliminam primul element dintr-un sir fara sa mutam toate elementele sirului cu o pozitie spre dreapta?
da. este suficient sa copiezi valoarea ultimului element in primul element, dupa care sa decrementezi variabila in care pastrezi numarul de elemente.
solutia asta nu functioneaza, evident, daca iti doresti (din diverse motive) sa pastrezi ordinea elementelor din lista, dar n-ai mentionat nimic de genul asta.

#12
Irbaa

Irbaa

    Junior Member

  • Grup: Junior Members
  • Posts: 43
  • Înscris: 15.03.2022
Da Smiley, m-am gandit si eu la asta , dar din  pacate e nevoie ca ordinea elementelor din sir sa ramana intacta.
Bun, am sa va arat exact la ce imi trebuie.
Date de intrare
Pe prima linie se află două numere, n și m.
Pe următoarele linii se află n numere naturale.
Pe următoarele m linii se află operațiile ce trebuie făcute:
    1 dacă trebuie extrasă prima foaie
    2 urmat de o valoare x, dacă trebuie introdusă o nouă foaie la sfârșit.
Date de ieșire
Pe prima linie se va afișa numărul de foi rămase pe biroul lui Andrei în urma executării celor m operații, iar pe a doua linie, numerele de identificare ale acestora.
Restricții
    1 ≤ n ≤ 900 000
    1 ≤ m ≤ 400 000
    Numerele sunt cuprinse intre 0 și 10 000, inclusiv
    Dacă șirul nu mai conține niciun element și trebuie efectuată o operație de tip 1, operația nu va fi efectuată.

iar codul meu arata cam asa
#include <iostream>
using namespace std;
int main() {
	int n , m , v[900001] , w [400001] , x;
	cin >> n >> m;
	for (int i = 1; i <= n; ++i){
		cin >> v[i];
   } 
  for (int i = 1; i <= m ; ++i){
	  cin >> w[i];
	  if (w[i] == 2){
		  cin >> x;
		  ++n;
		  v[n] = x;
	   }else if (w[i] == 1 && n > 0){
		for (int i = 1 ; i < n; ++i){
		v[i] = v[i + 1];
	}
	--n;
	}
}
 
	cout << n << "\n";
	for(int i = 1; i <= n; ++i){
	cout << v[i] << " " ;
  }
  return 0;
}

Codul e bun,zic eu dar e prea lent. Depasesc limita de timp la doua teste, nu iau punctaj maxim si ma gandesc ca o fii din cauza modului in care elimin primul element din sir, procesul e prea lent. Iau decat 80 de pcte la problema aceasta.

#13
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 28,916
  • Înscris: 24.02.2007
Evident ca e prea lent. Daca ti se cere de 400.000 de ori sa scoti cate un element din cele 900.000 initiale, ajungi sa faci sute de miliarde de mutari de elemente.

Extrasa prima foaie => incrementezi un contor/pointer si atat (cu verificare daca mai ai elemente inainte sa incrementezi).

#14
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 27,460
  • Înscris: 10.08.2005
O intrebare proasta, ce faci cand ai doar operatii "2"?

Ce rol are sirul "w"?

Edited by MarianG, 19 May 2022 - 22:56.


#15
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 19,019
  • Înscris: 24.02.2006

View PostIrbaa, on 19 mai 2022 - 18:27, said:

....Bun, am sa va arat exact la ce imi trebuie....
......Codul e bun,zic eu dar e prea lent...

varianta cea mai rapida este sa aloci de la inceput memorie pentru n+m elemente si sa pastrezi in 2 variabile pozitia primului si ultimului element din sir
- operatia 1 => doar incrementezi pozitia primului element (initial va fi zero), cu conditia sa ai elemente in sir (compari cele 2 pozitii)
- operatia 2 => adaugi valoarea la sfarsitul sirului (folosind pozitia ultimului element) si incrementezi pozitia ultimului element
la sfarsit calculezi numarul de elemente (diferenta dintre cele 2 pozitii + 1) si afisezi elementele
singura problema ar fi memorie: intotdeauna o sa aloci memorie ca si cum ai fi in situatia cea mai nefavorabila (doar operatii 2)

#16
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 27,460
  • Înscris: 10.08.2005
de fapt, de ce nu C++ ?
vector.erase(vector.begin()) respectiv
vector.push_back() ?
C++ fara dedesupturile cu alocari, dealocari, mutari, pointeri, indecsi


#17
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 28,916
  • Înscris: 24.02.2007
vector.erase(vector.begin()) e la fel de lent ca solutia existenta.

#18
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 27,460
  • Înscris: 10.08.2005
evident ca este,
acum ramane in sarcina lui sa adapteze indiciile ce i-au fost oferite
si sa prezinte solutia finala

Anunturi

Neurochirurgie minim invazivă 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

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