Jump to content
informatician

Caut om care sa stie c++/pascal

Recommended Posts

E ok daca ti le face cineva in pseudocod (gen) si ti le treci tu si in C++, si in Pascal, si in orice altceva vrei tu.

Tinand cont ca OLI a trecut, pun pariu ca vrei sa te pregatesti de OJI, si a cacat algoritmica in tine cu 2-3 saptamani inainte de proba.

PS: De curiozitate, la OLI ai avut o problema de cacat cu Scorpionii Rosii? :)) (sunt tot a 10a)

Daca stii backtracking,greedy,divide et impera, grafuri (grav) , zic ca te descurci la OJI. Dar, bineinteles, e imposibil din puct de vedere fizic sa inveti cacaturile astea, si sa te si descurci bine cu ele, in 3 saptamani.Totusi, incercarea moarte n-are.

Sa-ti fie invatatura de minte, banii nu fac nici pielea pulii fara cunostinte :)

PS: De ce nu pui problemele aici?

Link to comment
Share on other sites

Cacat.Exact asa zic si virginii care n-au vazut pizda decat in 2D (eventual anaglyph:)) ) .Chestiile astea nu se aproximeaza, stii sigur daca ai fost la 3 sau la 4 ONI-uri.

Si da, am vazut de starea de "binedispunere" in care banuiesc ca vrei sa arati societatii ca tu bagi etno.Chestia asta e ca manelele din masina.Toata lumea stie ca esti prost, doar tu nu-ti dai seama.

PS: Pentru informatician. Banuiesc ca ti-e sa nu afle mai stiu eu ce profa ca te inspiri de pe net, si de-aia eviti sa pui problemele intr-un topic.Pune-le pe ideone si da-ne linku.Asa n-o sa-ti indexeze cerinta. De ce sa dai bani degeaba?Fa un topic in care sa pui problemele, pana la urma merg facute si de plictiseala, ce pula mea?

Edited by Patrunjel
Link to comment
Share on other sites

Fie un ?ir a1, a2, ..., an de numere naturale. O secven?? a ?irului este o succesiune de elemente al?turate din ?ir, deci de forma ai, ai+1, ai+2, ..., aj-1, aj. Lungimea acestei secven?e este dat? de num?rul de elemente ale secven?ei, adic? j – i + 1.

Cerin?a

S? se determine o secven?? de lungime maxim? din ?ir cu proprietatea c? cel mai mare divizor comun al numerelor din secven?? este strict mai mare decât 1.

Date de intrare

Fi?ierul cmmdcsecv.in con?ine pe prima linie un num?r natural n reprezentând lungimea ?irului, iar pe linia a doua se afl? n numere naturale separate prin câte un spa?iu reprezentând elementele ?irului.

Date de iesire

Fi?ierul cmmdcsecv.out va con?ine un singur num?r natural reprezentând lungimea maxim? a unei secven?e care are cel mai mare divizor comun strict mai mare decât 1.

Daca are careva vreo idee..

PS.BONUS:

Consider?m o matrice p?tratic? având N linii ?i N coloane care memoreaz? numai valori 0 ?i 1. Matricea sufer? transform?ri în mai mul?i pa?i. La fiecare pas, toate componentele din matrice marcate cu 0 se vor transforma în 1 dac? au cel pu?in 3 vecini (pe linie, coloan? ?i diagonale) marcate cu 1. Procesul de transformare se repet? la fiecare pas, pân? când matricea are peste tot valoarea 1 sau pân? când nu mai poate surveni nicio transformare.

Cerin?a

S? se determine num?rul de pa?i necesari ca matricea s? aib? peste tot valoarea 1, sau pân? când nu mai are loc nicio transformare.

Date de intrare

Fi?ierul fillmat.in con?ine pe prima linie un num?r natural N reprezentând dimensiunea matricei. Pe urm?toarele N linii se g?sesc exact N caractere 0 ?i 1 reprezentând câte o linie din matrice. Elementele de pe linii nu sunt separate prin spa?ii.

Date de iesire

Fi?ierul fillmat.out va con?ine un singur num?r natural reprezentând num?rul de pa?i necesari pentru ca matricea s? con?in? peste tot valoarea 1, sau pân? când nu mai are loc nicio transformare.

Daca reusiti sa le faceti pe careva, sau daca aveti ideea de rezolvare, astept sugestiile voastre!

Edited by informatician
Link to comment
Share on other sites

Problema 1:


#include <fstream>
using namespace std;

int cmmdc(int a, int {
if(a%b == 0) return b;
else return cmmdc(b, a%;
}

int main() {
int n, maxSecv = 0, currSecv = 0, tempCmmdc, x;
ifstream fin("cmmdcsecv.in");
fin >> n;
for(int i = 0; i < n; i++) {
fin >> x;
if(x <= 1) currSecv = 0;
else {
currSecv++; // Crestem secventa curenta, presupunand ca e valida
if(currSecv == 1) tempCmmdc = x; // Daca e primul element din secventa, cmmdc-ul secventei este elementul in sine
tempCmmdc = cmmdc(tempCmmdc, x); // Calculeaza cmmdc-ul secventei, cmmdc(cmmdc_precedent, elementul_curent);
if(tempCmmdc <= 1) currSecv = 0; // Daca cmmdc-ul a devenit <= 1, trecem la o noua secventa.
if(currSecv > maxSecv) maxSecv = currSecv; // In caz ca dimensiunea secventei curente a depasit secventa maxima anterioara, secventa maxima devine cea curenta.
}
}
fin.close();

ofstream fout("cmmdcsecv.out");
fout << maxSecv;
fout.close();

return 1;
}

Asta ar trebui sa fie algoritmul de eficienta maxima.

Nu sunt foarte bun la explicatii, daca nu intelegi ceva spune.

Uita-te peste principiul de programare dinamica.

Revin spre seara cu a doua problema

Link to comment
Share on other sites

cmmdcsecv: C++ | #include <stdio.h> const unsigned int nmax = 10 - CmiN

filmat: C++ | #include <stdio.h> const unsigned int nmax = 10 - CmiN

[cmmdcsecv]

1) Se citesc datele in vector.

2) Pentru fiecare lungime (de la N la 1) pentru fiecare offset (capat de inceput i) se verifica cu ajutorul altei functii daca secventa ce incepe de pe pozitia i de lungime len are cmmdcul mai mare decat 1. Cmmdcul se afla destul de optim prin impartiri repetate.

3) Se scrie lungimea maxima (prima oara cand gaseste un pozitiv).

Complexitate: O(N^2)

[filmat]

1) Se citesc datele in matrice.

2) Cat timp se poate face o transformare (adica exista 0 cu cel putin 3 vecini) se executa whileul care ia fiecare element 0 din matrice ii verifica vecinii si cand a depistat 3 vecini de 1 poc elementul curent se transforma in 1, este incrementat numarul de transformari, si se marcheaza intr-o variabila ca s-a depistat cel putin o transformare (pentru while).

Note: vecinii sunt gasiti in felul urmator ... la elementul x[j], x[i - 1][j] este cel din nord, x[i - 1][j + 1] este cel din NE, x[j + 1] E, etc si astfel am notat in 2 vectori directiile (dlin, dcol) unde pentru fiecare directie de la 0 la 7 (8 directii) se afla o pereche de numere corespunzatoare directiei.

Complexitate: O(N^3) [in cazurile alea mai naspa]

Sunt sigur ca problmele se pot rezolva si mai optim din punct de vedere al complexitatii, iar pe baza ideii pe care am mers sunt optimizate destul.

Edit: Da cum ziceam :)) a lui knight e in timp liniar nu ma gandisem la asta.

Link to comment
Share on other sites

cMin mi-ai luat-o inainte cu a doua problema :D

O mica observatie... Problema spune ca la fiecare pas sa se faca transformarile respective. Tu faci o modificare pe o pozitie. Daca treci la o pozitie alaturata (pe cele 8 directii) de 0 ar trebui sa iei in calcul valoarea de la inceputul pasului care era pe pozitia transformata anterior, nu cea deja transformata. Cred c-ar trebui un vector trans[nmax][2] (trans[0] = x, trans[1] = y).

Corecteaza-ma daca gresesc...

Link to comment
Share on other sites

Rezolvarea celei de-a doua probleme ar trebuie sa arate cam asa:

#include <iostream.h>

#include <fstream.h>

void main()

{

int n,m[][];

string linie;

ofstream filmato("filmat.in");

filmati>>n;

for(int ln=0,ln<n,ln++)

{

string line ;

getline( filmati, line );

for(cn=0,cn<n,cn++)

{

if(line[cn]=='1')m[ln][cn]=1;

else m[ln][cn]=0;

}

}

filmato.close();

int vecini=0,trans=0,m1[][],st=0;

for(int i=0;i<n;i++)

{

for(int j=1;j<n;j++)

{ if(m[j]==0)

{

vecini=0;

if(m[i-1][j-1])vecini++;

if(m[j-1])vecini++;

if(m[i+1][j-1])vecini++;

if(m[i-1][j])vecini++;

if(m[i+1][j])vecini++;

if(m[i-1][j+1])vecini++;

if(m[j+1])vecini++;

if(m[i+1][j+1])vecini++;

}

else m1[j]=1;

if(vecini>=3)

{

m1[j]=1;trans=1;

}

else m1[j]=0;

}

if((i=n-1)&&(j=n-1))

{

for(int i1=0;i1<n;i1++)

{

for(int j1=0;j1<n;j1++)

{

m[i1][j1]=m1[i1][j1];

}

}

if(trans=1){i=0;j=0;}

trans=0;

st++;

}

}

ifstream filmati("filmat.out");

filmati<<st;

filmati.close();

}

Nu am mai programat demult asa ca C-ul meu e cam ruginit. Astept corecturile/intrebarile voastre.

http://pastebin.com/HCH8YCkV

Edited by darakna
Link to comment
Share on other sites

Rezolvarea celei de-a doua probleme ar trebuie sa arate cam asa:

Nu am mai programat demult asa ca C-ul meu e cam ruginit. Astept corecturile/intrebarile voastre.

C++ | #include <iostream.h> #include <fstream.h> v - Filmat

O sa iti dea eroare. Daca ai elementul curent matrice[0][0] cad te uiti la vecini o sa vezi matrice[-1][-1], matrice[-1][0], etc. adica "te uiti" in afara tabloului si o sa ai memory corrupted sau segmentation fault.

Link to comment
Share on other sites

Vin cu o corectie:

{

vecini=0;

if((i>0)&&(j>0)){if(m[i-1][j-1])vecini++;}

if(j>0){if(m[j-1])vecini++;}

if(i<n)&&(j>0){if(m[i+1][j-1])vecini++;}

if(i>0){(if(m[i-1][j])vecini++;}

if(i<n){if(m[i+1][j])vecini++;}

if((i>0)&&(j<n)){if(m[i-1][j+1])vecini++;}

if(j<n){if(m[j+1])vecini++;}

if((i<n)&&(j<n)){if(m[i+1][j+1])vecini++;}

}

else m1[j]=1;

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...