Orar semigroup #2

Orar semigroup #2

Archive for mai 2011

16 mai - probleme teza

Se dau n cutii de forma cubica, pentru care cunoastem latura. Cutiile sunt aliniate in ordine crescatoare a laturii acestora. Se mai da o cutie de latura data L. Dorim sa plasam cutia, intr-una cat mai apropiata ca dimensiune. Sa se afiseze latura acesteia.

#include<iostream>
using namespace std;
int x[100],n;

int binar(int a[],int x, int st, int dr, int &c,int &d)
{int m;
c=st;
d=dr;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(a[m]>x)
    return binar(a,x,st,m-1,c,d);
else if(a[m]<x) return binar(a,x,m+1,dr,c,d);
    else return m;
}

int main()
{int i,L,st,dr;
cout<<"L=";cin>>L;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
    cin>>x[i];
binar(x,L,0,n-1,st,dr);
cout<<"Plasam cutia de latura "<<L<<" in cutia de latura "<<x[st]<<endl;
//cout<<"dr="<<dr<<endl;
}
Se da un tablou de numere naturale, ordonat strict crescator. Dorim sa inseram in el o valoare data y, doar in cazul in care aceasta nu mai apare in tablou. Sa se afiseze elementele intre care se insereaza.
#include<iostream>
using namespace std;
int x[100],n;
int binar(int a[],int x, int st, int dr, int &c,int &d)
{int m;
c=st;
d=dr;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(a[m]>x)
    return binar(a,x,st,m-1,c,d);
else if(a[m]<x) return binar(a,x,m+1,dr,c,d);
    else return m;
}

int main()
{int i,L,st,dr;
cout<<"L=";cin>>L;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
    cin>>x[i];
if(binar(x,L,0,n-1,st,dr)==-1)
    cout<<L<<" trebuie inserat intre "<<x[dr]<<" si "<<x[st]<<endl;
else cout<<L<<" exista in vector";
}
Se dau n numere intregi pentru care se cere sa se afiseze modalitatea de calcul a produsului lor prin metoda D&I  Ex: pentru n=5 se va afisa  ((x1*x2)*x3)*(x4*x5)).
#include <iostream>
using namespace std;
int x[100],n;

void DI(int st, int dr){
int s1,s2,m;
if(st==dr)
{cout<<x[dr]; return;}
m=(st+dr)/2;
cout<<"(";
DI(st,m);
cout<<"*";
DI(m+1,dr);
cout<<")";
}

int main(){
int i,st=0,dr;
cin>>n;
for(i=0;i<n;i++)
    cin>>x[i];
dr=n-1;
DI(st,dr);
return 0;
}

marți, 17 mai 2011 by DlMuresan
Categories: | 1 comment

6 mai - stânga/dreapta cu Gorgan + Temă grafică/9 mai

1) Să se afişeze intervalele în care se face căutarea unui element într-un vector ordonat folosind algoritmul de căutare binară.

#include<iostream>
using namespace std;

void ordonare(int a[], int n)
{int i,j;
for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
        if(a[i]>a[j])
            swap(a[i],a[j]);
}

int binar(int a[],int x, int st, int dr)
{int m;
cout<<"["<<a[st]<<","<<a[dr]<<"]"<<endl;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(a[m]>x)
{return binar(a,x,st,m-1);}
else if(a[m]<x) {return binar(a,x,m+1,dr);}
    else return m;
}

void eliminare(int a[],int n,int i)
{int j;
for(j=i;j<n-1;j++)
    a[j]=a[j+1];
}
   
int main()
{int n,a[100],st,dr,s,j,i,s1,s2;
cout<<"n=";
cin>>n;
cout<<"s=";
cin>>s;
cout<<"Citire vector"<<endl;
for(i=0;i<n;i++)
    cin>>a[i];
ordonare(a,n);
cout<<"Afisare vector"<<endl;
for(i=0;i<n;i++)
    cout<<a[i]<<" ";
cout<<endl<<"Intervale"<<endl;
binar(a,s,0,n-1);
}
2) n copii sunt înşiraţi la ora de sport. Gorgan vrea să aleagă un conducător în felul următor:
- dacă spune dreapta, copiii din dreapta rămân pe loc şi ceilaţi pleacă la vestiare
- dacă spune stânga, copiii din stânga rămân pe loc şi ceilalţi pleacă la vestiare
- copilul din mijloc pleacă şi el la vestiare (dacă numărul de copii este impar)
- ultimul rămas este conducătorul
Cunoscându-se numărul de pe tricouri: 1,2,...,n, să se spună dacă elevul cu numărul y poate deveni conducător şi să se afişeze ce spune profesorul în acest caz. 
#include<iostream>
using namespace std;

void afisare(int a[], int n)
{int i;
for(i=1;i<=n;i++)
    cout<<a[i]<<" ";
}

int binar(int a[],int x, int st, int dr)
{int m;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(a[m]>x)
{return binar(a,x,st,m-1);}
else if(a[m]<x) {return binar(a,x,m+1,dr);}
    else return m;
}

void eliminare(int a[],int &n,int i)
{int j;
for(j=i;j<=n;j++)
    a[j]=a[j+1];
n--;
}
 
int main()
{int n,a[100],st,dr,s,j,i,s1,s2,y,t,g;
cout<<"n=";cin>>n;
cout<<"y=";cin>>y;
for(i=1;i<=n;i++)
    a[i]=i;
cout<<"Afisare elevi"<<endl;
for(i=1;i<=n;i++)
    cout<<a[i]<<" ";
cout<<endl<<endl<<"GORGAN says"<<endl;

while(a[1]!=y || n>1)
{
cout<<n<<" "<<endl;
afisare(a,n);
cout<<endl<<endl;
if(n%2==1 && y==n/2+1)
    {cout<<"Nu poate fi conducator"; return 0;}
if(binar(a,y,1,n)==-1)
    {cout<<"Nu poate fi conducator"; return 0;}
if(binar(a,y,1,n)<=n/2)
    cout<<"stanga "<<endl;
else if(binar(a,y,1,n)>n/2)
    cout<<"dreapta "<<endl;

if(binar(a,y,1,n)<=n/2)
    n=n/2;
else if(binar(a,y,1,n)>n/2)
        {if(n%2==1)
            g=n/2+1;
        else g=n/2;
        for(t=1;t<=g;t++)
            eliminare(a,n,1);
        }
        //afisare(a,n);
}

afisare(a,n);
}
3) Temă grafică
#include<graphics.h>
#include<iostream>
using namespace std;

void patrat(int xs,int ys,int l, int n)
{if(n)
{patrat(xs+3*l/4,ys-l/4,l/2,n-1);
patrat(xs+3*l/4,ys+3*l/4,l/2,n-1);
if(n%2==0)
    setfillstyle(1,2);
else setfillstyle(1,10);
delay(10);
bar(xs,ys,xs+l,ys+l);}
}

int main()
{initwindow(800,800);
patrat(20,250,200,10);
delay(100000);
}
4) Sa se modifice algoritmul de cautare binara astfel incat sa se afiseze mesaul DA sau NU in functie de rezultatul cautarii.
#include<iostream>
using namespace std;
char* binar(int a[],int x, int st, int dr)
{int m;
if(st>dr)
    return "NU";
m=(st+dr)/2;
if(a[m]>x)
{return binar(a,x,st,m-1);}
else if(a[m]<x) {return binar(a,x,m+1,dr);}
    else return "DA";
}

int main()
{int y,n,a[100],i;
cout<<"y=";cin>>y;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
    cin>>a[i];
cout<<binar(a,y,0,n-1);
}
5) Sa se afiseze stanga sau dreapta.
#include<iostream>
using namespace std;
void binar(int a[],int x, int st, int dr)
{int m;
if(st>dr)
    cout<<"NU";
m=(st+dr)/2;
if(a[m]>x)
{cout<<"stanga";binar(a,x,st,m-1);}
else if(a[m]<x) {cout<<"dreapta";binar(a,x,m+1,dr);}
    else cout<<"DA";
}

int main()
{int y,n,a[100],i;
cout<<"y=";cin>>y;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
    cin>>a[i];
binar(a,y,0,n-1);
}
6) Sa se afiseze modul de calculare a cmmdc a n numere naturale folosind algoritmul DI.
#include <iostream>
using namespace std;
int x[100],n;

void DI(int st, int dr){
int s1,s2,m;
if(st==dr)
{cout<<x[dr]; return;}
m=(st+dr)/2;
cout<<"cmmdc(";
DI(st,m);
cout<<",";
DI(m+1,dr);
cout<<")";
}

int main(){
int i,st=0,dr;
cin>>n;
for(i=0;i<n;i++)
cin>>x[i];
dr=n-1;
DI(st,dr);
return 0;
}

duminică, 15 mai 2011 by DlMuresan
Categories: , , , , , | Leave a comment

12 mai - Mergesort

Se citeste de la tastatura un tablou neordonat cu n elemente. Dorim sa-l ordonam crescator.

#include<iostream>
using namespace std;
int a[100],n;

void interclasare(int st, int m, int dr)
{int i,j,b[100],k;
i=st;
j=m+1;
k=0;
while(i<=m && j<=dr)
if(a[i]<=a[j])
b[k++]=a[i++];
else b[k++]=a[j++];

while(i<=m)
b[k++]=a[i++];
while(j<=dr)
b[k++]=a[j++];
for(i=st;i<=dr;i++)
a[i]=b[i-st];
}

void mergesort(int st, int dr)
{if(st<dr)
{int m;
m=(st+dr)/2;
mergesort(st,m);
mergesort(m+1,dr);
interclasare(st,m,dr);
}
}

int main()
{int i;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
mergesort(0,n-1);
for(i=0;i<n;i++)
cout<<a[i]<<" ";
}

joi, 12 mai 2011 by DlMuresan
Categories: , , , , , , | Leave a comment

11 mai - interclasare + TEMĂ/12

#include<iostream>
using namespace std;

void interclasare(int a[], int b[], int c[], int &k, int n, int m)
{int i,j;
i=j=k=0;
while(i<n && j<m)
    {
    if(a[i]<=b[j])
        {c[k]=a[i];i++;k++;}
    else {c[k]=b[j];j++;k++;}
    }
while(i<n)
    {c[k]=a[i];i++;k++;}
while(j<m)
    {c[k]=b[j];j++;k++;}
}

int main()
{int a[100],b[100],c[100],n,m,i,j,k;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
    cin>>a[i];
cout<<"m=";cin>>m;
for(j=0;j<m;j++)
    cin>>b[j];
interclasare(a,b,c,k,n,m);
for(i=0;i<k;i++)
    cout<<c[i]<<" ";
}
1) Se da un şir X sortat crescăţor. Se dă un şir Y neordonat. Pentru fiecare element din şirul Y să se determine dacă acesta apare în şirul X şi să se numere câte apeluri ale funcţiei de căutare binară s-au făcut.
#include<iostream>
using namespace std;
int a[100],m[100],mm,apel[100]={0},i,nr,limita;

void ordonare(int x[], int n)
{int i,j;
for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
        if(x[i]>x[j])
            swap(x[i],x[j]);
}

int binar(int v[],int x, int st, int dr, int &y)
{int m;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(v[m]>x)
    {y++;return binar(v,x,st,m-1,y);}
else if(v[m]<x) {y++;return binar(v,x,m+1,dr,y);}
    else return m;
}

int main()
{
cout<<"nr de elemente ale lui X=";cin>>nr;
for(i=0;i<nr;i++)
    cin>>a[i];
ordonare(a,nr);
cout<<"nr de elemente ale lui Y=";cin>>mm;
for(i=0;i<mm;i++)
    cin>>m[i];
for(i=0;i<mm;i++)
    if(binar(a,m[i],0,nr-1,apel[i])==-1)
        apel[i]=-1;
    else binar(a,m[i],0,nr-1,apel[i]);
cout<<endl;
for(i=0;i<mm;i++)
    if(apel[i]==-1)
        cout<<m[i]<<" nu apare in sirul y"<<endl;
    else cout<<"Pentru "<<m[i]<<" au fost necesare "<<apel[i]<<" apeluri"<<endl;
}
2) Se dau 2 şiruri, X şi Y, neordonate. Să se determine folosind DI pentru fiecare element din Y de câte ori apare în X.
#include<iostream>
using namespace std;

void ordonare(int x[], int n)
{int i,j;
for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
        if(x[i]>x[j])
            swap(x[i],x[j]);
}

int binar(int v[],int x, int st, int dr)
{int m;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(v[m]>x)
    {return binar(v,x,st,m-1);}
else if(v[m]<x) {return binar(v,x,m+1,dr);}
    else return m;
}

int DI(int x[],int p,int st, int dr)
{int m,s1,s2;
if(st==dr && x[dr]==p)
    return 1;
else if(st==dr)
    return 0;
m=(st+dr)/2;
s1=DI(x,p,st,m);
s2=DI(x,p,m+1,dr);
return s1+s2;
}

int main()
{int x[100],y[100],i,j,m,n,p,r,t,k;
cout<<"nr X=";cin>>n;
for(i=0;i<n;i++)
    cin>>x[i];
sort(x,n+x);
cout<<"nr Y=";cin>>m;
for(i=0;i<m;i++)
    cin>>y[i];
for(i=0;i<m;i++)
    cout<<y[i]<<" apare de "<<DI(x,y[i],0,n-1)<<" ori in sirul X"<<endl;
}

marți, 10 mai 2011 by DlMuresan
Categories: , , | Leave a comment

5 mai - cautare binara, a+b=S

Se citeşte de la tastatură un tablou de n numere întregi. Să se afişeze toate perechile de elemente din tablou care au suma egală cu o valoare dată, s.

#include<iostream>
using namespace std;

void ordonare(int a[], int n)
{int i,j;
for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
        if(a[i]>a[j])
            swap(a[i],a[j]);
}

int binar(int a[],int x, int st, int dr)
{int m;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(a[m]>x)
    return binar(a,x,st,m-1);
else if(a[m]<x) return binar(a,x,m+1,dr);
    else return m;
}

int main()
{int n,a[100],m,s,j,i,s1,s2;
cout<<"n=";
cin>>n;
cout<<"s=";
cin>>s;
cout<<"Citire vector"<<endl;
for(i=0;i<n;i++)
    cin>>a[i];
ordonare(a,n);
cout<<"Afisare vector"<<endl;
for(i=0;i<n;i++)
    cout<<a[i]<<" ";
cout<<endl<<endl<<"Solutii"<<endl;
for(i=n-1;i>=0 && a[i]>s;i--);
if(i==-1)
{cout<<"Nu exista solutii";return 0;}
n=i+1;
for(j=0;j<n && a[j]<=s/2;j++)
{s1=a[j];
s2=s-s1;
if(binar(a,s2,j+1,n-1)!=-1)
    cout<<s1<<"+"<<s2<<"="<<s<<endl;
}
}

joi, 5 mai 2011 by DlMuresan
Categories: , , , , , | Leave a comment

28 aprilie - patrare şi triunghiuri

1) Pătrate în colţ.

#include<graphics.h>
#include<iostream>
using namespace std;

void patrat(int xs,int ys,int l, int n)
{if(n)
{patrat(xs-l/4,ys-l/4,l/2,n-1);
patrat(xs+3*l/4,ys-l/4,l/2,n-1);
patrat(xs-l/4,ys+3*l/4,l/2,n-1);
patrat(xs+3*l/4,ys+3*l/4,l/2,n-1);
if(n%2==0)
    setfillstyle(1,0);
else setfillstyle(1,15);
delay(10);
bar(xs,ys,xs+l,ys+l);}
}

int main()
{initwindow(800,800);
patrat(350,350,200,5);
delay(100000);
}
2) Triunghiul domnului Sierpinski/y. // not funcţională
http://er.adrianmoisei.com/java/triunghi.html
#include<graphics.h>
#include<iostream>
using namespace std;

void triunghi(int xa,int ya,int xb,int yb,int xc,int yc,int n)
{
if(n){
line(xa,ya,xb,yb);
line(xa,ya,xc,yc);
line(xb,yb,xc,yc);
line((xa+xb)/2,(ya+yb)/2,(xa+xc)/2,(ya+yc)/2);
line((xa+xb)/2,(ya+yb)/2,(xb+xc)/2,(yb+yc)/2);
line((xa+xc)/2,(ya+yc)/2,(xb+xc)/2,(yb+yc)/2);
setfillstyle(1,2);
floodfill((xa+xb+xc)/3,(ya+yb+yc)/3,15);
triunghi((xa+xb)/4,(ya+yb)/4,(xa+xc)/4,(ya+yb)/4,xc/2,yc/2,n-1);
}
}

int main()
{initwindow(801,801);
triunghi(400,0,0,800,800,800,5);
delay(100000);
}
#include<graphics.h>
#include<iostream>
using namespace std;

void triunghi(int xa,int ya,int xb,int yb,int xc,int yc,int n)
{
if(n){
line(xa,ya,xb,yb);
line(xa,ya,xc,yc);
line(xb,yb,xc,yc);
line((xa+xb)/2,(ya+yb)/2,(xa+xc)/2,(ya+yc)/2);
line((xa+xb)/2,(ya+yb)/2,(xb+xc)/2,(yb+yc)/2);
line((xa+xc)/2,(ya+yc)/2,(xb+xc)/2,(yb+yc)/2);
setfillstyle(1,2);
floodfill((xa+xb+xc)/3,(ya+yb+yc)/3,15);
triunghi(3*(xa+xb)/4,(ya+yb)/6,(xa+xc)/8.4,(ya+yc)/4,(xb+xc)/2,(yb+yc)/4,n-1);
}
}

int main()
{initwindow(801,801);
triunghi(400,0,0,800,800,800,5);
delay(100000);
}

by DlMuresan
Categories: , , | Leave a comment

4 mai - algoritm de căutare binară + Tema/5

Algoritm de căutare binară

#include<iostream>
using namespace std;
int v[100],n;

int DI(int x, int st, int dr)
{int m;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(v[m]>x)
    return DI(x,st,m-1);
else if(v[m]<x) return DI(x,m+1,dr);
    else return m;

}

int main()
{int i,x;
cout<<"n=";cin>>n;
cout<<"x=";cin>>x;
for(i=0;i<n;i++)
    cin>>v[i];
cout<<DI(x,0,n-1);}
Vom genera aleator un tablou cu 1000 de elemente distincte. Îl vom ordona strict crescător. Elementele tabloului le vom genera între 1 şi 1 milion. Vom căuta în acest şir m numere naturale pe care le vom genera tot aleator. Pentru fiecare număru căutat vom memora numărul de apeluri ale funcţiei de căutare binară.
#include<iostream>
using namespace std;
int a[100],m[100],mm,apel[100]={0},i,nr,limita;

void fort(int x[], int nr, int limita)
{ int u,p=0,i,ok;
    u=rand()%limita+1;
x[0]=u;
p++;
while(p<nr)
{
    ok=0;
    u=rand()%limita+1;
    for(i=0;i<p;i++)
    {
        if(x[i]==u)
            ok=1;
    }
    if(ok==0)
    {
        x[p]=u;
        p++;
    }
}
}

void ordonare(int x[], int n)
{int i,j;
for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
        if(x[i]>x[j])
            swap(x[i],x[j]);
}

int binar(int v[],int x, int st, int dr, int &y)
{int m;
if(st>dr)
    return -1;
m=(st+dr)/2;
if(v[m]>x)
    {y++;return binar(v,x,st,m-1,y);}
else if(v[m]<x) {y++;return binar(v,x,m+1,dr,y);}
    else return m;
}

int main()
{
cout<<"nr de elemente ale vectorului mare=";cin>>nr;
cout<<"limita elementelor generate=";cin>>limita;
fort(a,nr,limita);
ordonare(a,nr);
for(i=0;i<nr;i++)
    cout<<a[i]<<" ";
cout<<endl<<endl<<"nr de elemente ale vectorului mic=";cin>>mm;
fort(m,mm,limita);
ordonare(m,mm);
for(i=0;i<mm;i++)
    cout<<m[i]<<" ";
for(i=0;i<mm;i++)
    binar(a,m[i],0,nr-1,apel[i]);
cout<<endl;
for(i=0;i<mm;i++)
    cout<<"Pentru "<<m[i]<<" au fost necesare "<<apel[i]<<" apeluri"<<endl;
}

by DlMuresan
Categories: , , , , | 2 comments