Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Exemplu:
eur.in
444 5 2
eur.out
13 bancnote de valoarea 32
1 bancnote de valoarea 16
1 bancnote de valoarea 8
1 bancnote de valoarea 4
16
Explicatie: n=5, e=2 rezulta ca bancotele au valorile 1, 2, 4, 8, 16 si 32.
REZOLVARE :
#include <fstream>
ifstream fin("eur.in");
ofstream fout("eur.out");
int main()
{
int S,n,e,t=0;
fin>>S>>n>>e;
int p=1,k=0;
while(p*e<=S && k<n) //calc. bancota maxima (<=S avand cel mult valoarea e la n)
{
p=p*e;
k++;
}
while(S>0)
{
if(S>=p) fout<<S/p<<"bancnote de valoarea"<<p<<endl; //bancnotele de valoare p
fout<<t;
return 0;
}
2. Problema rucsacului (cazul continuu)
O persoana are un rucsac cu care poate transporta o greutate maxima g. Persoana are la dispozitie n
obiecte pentru care stie greutatea si castigul obtinut daca transporta obiectul.
Fiecare obiect poate fi transportat integral sau taiat.
Sa se precizeze ce obiecte alege persoana si in ce proportie le ia astfel incat castigul total sa fie maxim
si sa nu se depaseasca greutatea maxima a rucsacului.
Exemplu:
g=3 n=3
obiectele(greutate,castig):
2 2
1 4
3 6
Solutie(greutate, castig, raport taiere):
1,4,1
3,6,0.6667 (al doilea obiect se ia in raport de 2/3)
castig maxim=8
REZOLVARE :
#include<fstream>
#include<iomanip>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
struct obiect
{
float g,c,r; //greutate, castig, raportul cat se ia din obiect
};
int main()
{
int n;
obiect a[100];
float g;
citire(g,n,a);
ordonare(n,a);
greedy(g,n,a);
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
struct spectacol
{
int s,d;
};
int main()
{
int n;
spectacol a[100];
citire(n,a);
ordonare(n,a);
greedy(n,a);
fin.close();
fout.close();
}
DIVIDE ET IMPERA
1. Folosind metoda divide et impera, scrieti o functie care sa determine daca un tablou cu
elemente intregi este ordonat crescator.
REZOLVARE :
2. Scrieti o functie minmax care sa determine elementul minim si elementul maxim dintr-un
tablou cu elemente intregi folosind metoda divide et impera.
REZOLVARE :
REZOLVARE :
#include<iostream>
int main()
{
int a[100],n,i;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
cout<<cmmdc(a,1,n);
system("pause");
return 0;
}
REZOLVARE :
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int main()
{
int a[50000], n;
citire(a,n);
msort(a,1,n);
afis(a,n);
return 0;}
5. Se citeste un vector cu n elemente numere naturale. Sa se calculeze suma elementelor
vectorului folosind divide et impera.
REZOLVARE :
#include<iostream>
int main()
{
int a[100],n,i;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
cout<<suma(a,1,n);
system("pause");
return 0;
}
#include<iostream>
}
}
int main()
{
int a[100];
int n ;
cin>> n;
for (int i = 0 ; i < n ;i++)
cin>>a[i];
system("pause");
return 0;
}
7. Cautarea binara.
REZOLVARE :
#include<fstream>
int main()
{
int x,i,n,a[100],s,d,m,gasit=0;
fin>>n;
for(i=1;i<=n;i++) fin>>a[i];
fin>>x;
s=1; d=n;
while(s<=d && !gasit)
{
m=(s+d)/2;
if(a[m]==x) gasit=1;
else if(a[m]<x) s=m+1;
else d=m-1;
}
if(gasit) fout<<m;
else fout<<"Nu se gaseste";
fin.close();
fout.close();
return 0;
}
REZOLVARE :
#include<iostream>
using namespace std;
double r3(double x, double s, double d)
{
if(d-s<=0.0001) return d;
else
{ double m=(s+d)/2;
if(m*m*m<x) return r3(x,m,d);
else return r3(x,s,m);
}
}
int main()
{ double x;
cin>>x;
if(x>0) if(x<1) cout<<r3(x,0,1);
else cout<<r3(x,0,x);
else if(x>-1) cout<<r3(x,-1,0);
else cout<<r3(x,x,0);
system("pause");
return 0;
}
BACKTRACKING
1. Se citeste un numar natural n. Generati si afisati toate combinatiile de cate n cifre binare care
nu au doua cifre de 1 alaturate.
Exemplu:
n=3
combinatiile sunt:
0 0 0
0 0 1
0 1 0
1 0 0
1 0 1
REZOLVARE :
#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");
int x[15],n;
void afis()
{
for(int i=1;i<=n;i++)
os<<x[i]<<" ";
os<<endl;
}
void back01(int k)
{
for(int i=0;i<=1;i++)
{
x[k]=i;
if(k>1) if(x[k]*x[k-1]!=1)
if(k==n) afis();
else back01(k+1);
else ;
else back01(k+1);
}
}
int main()
{
is>>n;
back01(1);
is.close();
os.close();
return 0;
}
2. Sa se afiseze in ordine alfabetica anagramele unui cuvant format din litere distincte.
Exemplu:
date.in date.out
rac acr
arc
car
cra
rac
rca
REZOLVARE :
#include <cstring>
#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");
int n;
char v[100],st[50], p[50];
void scrie() //afisez litere conform permutarii
{
int i;
{
for(i=1;i<=n;i++)
os<<v[st[i]-1];
os<<'\n';
}
}
int main()
{
int i;
is.get(v,1000);
n=strlen(v);
for(int i=0;i<n;i++) //ordonez alfabetic literele din cuvantul citit
for(int j=i+1;j<n;j++)
if(v[i]>v[j])
{ char aux=v[i]; v[i]=v[j]; v[j]=aux; }
back(1);
return 0;
}
3. Se citeste un numar natural n. Afisati permutarile multimii 1,2,3...n in care elementele pare
sunt puncte fixe (se afla pe pozitie egale cu valoarea lor).
Exemplu:
n=5
permutarile care respecta conditia sunt:
1 2 3 4 5
1 2 5 4 3
3 2 1 4 5
3 2 5 4 1
5 2 1 4 3
5 2 3 4 1
(2 si 4 sunt puncte fixe)
REZOLVARE :
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
void afis()
{
for(int i=1;i<=n;i++)
if(i%2==0) fout<<i<<" ";
else fout<<sol[i]<<" ";
fout<<endl;
}
void back(int k)
{
for(int i=1;i<=n;i=i+2)
if(p[i]==0)
{
sol[k]=i;
p[i]=1;
if(n%2==0 && k==n-1 || n%2==1 && k==n) afis();
else back(k+2);
p[i]=0;
}
}
int main()
{
fin>>n;
back(1);
fin.close();
fout.close();
}
4. Se citeste un numar natural n. Afisati permutarile multimii 1,2,3...n in care pana la jumatate
elementele sunt in ordine descrescatoare, iar de la jumatate pana la final in ordine
crescatoare.
Exemplu:
n=5
permutarile care respecta conditia sunt:
3 2 1 4 5
4 2 1 3 5
4 3 1 2 5
5 2 1 3 4
5 3 1 2 4
5 4 1 2 3
REZOLVARE :
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
void afis()
{
for(int i=1;i<=n;i++)
fout<<sol[i]<<" ";
fout<<endl;
}
int valid(int k)
{
if(k>1)
if(k<=(n+1)/2) { if(sol[k]>sol[k-1]) return 0; }
else if(sol[k]<sol[k-1]) return 0;
return 1;
}
void back(int k)
{
for(int i=1;i<=n;i++)
if(p[i]==0)
{
sol[k]=i;
p[i]=1;
if(valid(k)) if(k==n) afis();
else back(k+1);
p[i]=0;
}
}
int main()
{
fin>>n;
back(1);
fin.close();
fout.close();
}
5. Se citesc doua numere naturale n si k, k fiind mai mic decat numarul de cifre ale numarului n.
Afisati cel mai mare numar care se poate forma eliminand k cifre din numarul n.
Exemplu:
n=3452234
k=4
numarul cautat este 534
REZOLVARE :
#include <iostream>
using namespace std;
int n, a[10],x[10],maxx,k;
int main()
{
cin>>n>>k;
int i=0;
while(n)
{
a[++i]=n%10;
n=n/10;
}
n=i;
back(1,n-k);
cout<<maxx;
return 0;
}
6. Se citesc doua numere naturale n si k. Generati si afisati toate toate numerele naturale
formate din n cifre care contin exact k cifre de 1.
REZOLVARE :
#include <iostream>
using namespace std;
int x[50],n,k;
void afis()
{
for(int i=1;i<=n;i++)
cout<<x[i];
cout<<endl;
}
7. Se citeste un numar natural n. Afisati toate numerele formate din n cifre in care oricare doua
cifre alaturate au paritate diferita.
Ex. Pentru n=4 se vor obtine:
1010
1012
...
2101
2103
...
9898
REZOLVARE :
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int main()
{
int x[100],n;
fin>>n;
back(x,n,1);
fin.close();
fout.close();
return 0;
}
8. Sa se afiseze toate numerele naturale formate doar din cifre impare distincte, sa se calculeze
suma si numarul acestora
REZOLVARE :
#include<iostream>
using namespace std;
void Write(int p)
{ for(int i=1;i<=p;i++) cout<<x[i];
cout<<endl;
int a=0;
for(int i=1;i<=p;i++) a=a*10+x[i];
suma=suma+a;
nr++;
}
void Aranj(int k, int p)
{ for(int i=1;i<=9;i=i+2)
if(!pus[i])
{ x[k]=i;
pus[i]=1;
if(k==p) Write(p);
else Aranj(k+1,p);
pus[i]=0;
}
}
int main()
{ n=5;
for(p=1;p<=5;p++) Aranj(1,p);
cout<<"suma este"<<suma<<" din "<<nr<< "numere";
return 0;
}
9. Se citeste un numar natural n. Sa se afiseze in fisierul text cuv.out toate cuvintele de n litere
formate doar din litere mici care nu au doua voale alaturate si nici 2 consoane alaturate.
REZOLVARE :
#include<fstream>
#include<string>
int n;
char x[20];
ofstream f("cuv.out");
char v[]="aeiou";
void afis()
{ for(int i=1;i<=n;i++) f<<x[i];
f<<endl;
}
int cond(int k)
{ for(int i=1;i<k;i++) if(x[i]==x[k]) return 0;
if(k>1)
{
if(strchr(v,x[k-1])!=0 && strchr(v,x[k])!=0) return 0;
if(strchr(v,x[k-1])==0 && strchr(v,x[k])==0) return 0;
}
return 1;
}
void back(int k)
{ char i;
for(i='a';i<='z';i++)
{ x[k]=i;
if(cond(k)) if(k==n) afis();
else back(k+1);
}
}
void main()
{ cin>>n;
back(1);
f.close();
}