5 METODA GREEDY
2.Se dă o mulţime A={a1, a2, . . ., an} cu elemente întregi. Să se determine cele mai
mari două elemente ale mulţimii.
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int n,i,a,maxi1,maxi2,aux;
int main()
{
f>>n;
for(i=1;i<=n;i++)
{
f>>a;
if(a>maxi1)maxi1=a;
if(maxi2<maxi1){aux=maxi1; maxi1=maxi2; maxi2=aux;}
}
cout<<maxi1<<" "<<maxi2;
}
Într-o sală de spectacol trebuie planificate n spectacole într-o zi. Pentru fiecare spectacol
se cunosc ora de început și ora de terminare (numere întregi). Să se planifice un număr maxim
de spectacole astfel încât să nu fie doua spectacole care să se suprapună.
Rezolvare:
Soluția problemei se va construi după următorul algoritm:
Pas 1 Se sortează spectacolele după ora terminării lor;
Pas 2 Primul spectacol ales este cel care se termină cel mai devreme;
Pas 3 Se alege primul spectacol care îndeplinește condiția că începe după ce s-a terminat
ultimul spectacol programat;
Pas 4 Dacă nu s-a găsit un asemenea spectacol atunci algoritmul se termină altfel se
programează spectacolul găsit și se reia pasul 3.
Exemplu fișierul date.in conține pe prima linie numărul de spectacole și apoi ora de
începere și ora de terminare pentru fiecare spectacol:
8
9 11
12 13
8 10
10 12
16 18
14 16
20 22
19 21
Soluția problemei va fi:
8,10 10,12 12,13 14,16 16,18 19,21
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
struct spectacol
{ int s,d; };
void citire(int &n, spectacol a[])
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>a[i].s>>a[i].d;
}
void ordonare(int n, spectacol a[])
{
int i,j;
spectacol aux;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(a[i].d>a[j].d)
{aux=a[i]; a[i]=a[j]; a[j]=aux; }}
void afisare(int n, spectacol a[])
{
for(int i=1;i<=n;i++)
fout<<a[i].s<<","<<a[i].d<<" ";
}
void greedy(int n, spectacol a[])
{
spectacol s[100];
int i,k;
k=1;
s[1]=a[1];
for(i=2;i<=n;i++)
if(s[k].d<a[i].s) s[++k]=a[i];
afisare(k,s);
}
int main()
{
int n;
spectacol a[100];
citire(n,a);
ordonare(n,a);
greedy(n,a);
fin.close();
fout.close();
}
#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 };
{ fout<<a[i].g<<","<<a[i].c<<","<<setprecision(4)<<a[i].r<<endl;
c=c+a[i].c*a[i].r;
}
fout<<"castig maxim="<<c;
}
5.PROBLEMA COMIS-VOIAJORULUI
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int s[100],viz[100],n,x;
int a[100][100];
void citire()
{
int i,j;
fin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
fin>>a[i][j];
}
void afișare()
{ for(int i=1;i<=n;i++) fout<<s[i]<< ' ';
fout<<endl<<x;
}
void voiajor(int k)
{ int min=100000,imin;
for(int i=1;i<=n;i++)
if(!viz[i] && a[s[k-1]][i]<min && i!=s[k-1])
{
min=a[s[k-1]][i];
imin=i;
}
s[k]=imin;
viz[imin]=1;
x=x+a[s[k-1]][imin];
if(k==n) afisare();
else voiajor(k+1);
}
int main()
{
citire();
s[1]=1;
viz[1]=1;
voiajor(2);
fin.close();
fout.close();
return 0;
}
6.Fiind dată o hartă cu n țări, se cere o soluție de colorare a hărții, utilizând cel mult
patru culori, astfel încât două țări ce au frontiera comună să fie colorate diferit.
Date.in
6
alb verde galben rosu
12
13
14
15
16
23
25
26
34
35
45
56
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int a[101][101];
int x[101],n;
char c[5][21];
void afisare()
{
for(int i=1;i<=n;i++)
fout<<i<<" "<<c[x[i]]<<endl;
fout<<endl;
}
int valid(int k)
{ for(int i=1;i<k;i++)
if(a[i][k]==1 && x[i]==x[k]) return 0;
return 1;
}
int alege(int k)
{ for(int i=1;i<=4;i++)
{
x[k]=i;
if(valid(k)) return i;
}
return 0;
}
void colorare()
{ for(int i=1;i<=n;i++)
x[i]=alege(i);
}
int main()
{
int t1,t2;
fin>>n;
for(int i=1;i<=4;i++)
fin>>c[i];
while(fin>>t1>>t2)
{
a[t1][t2]=1;//pun 1 in matrice
a[t2][t1]=1;
}
colorare();
afisare();
fin.close();
fout.close();
return 0;
}
int main()
{
int S,n,e,t=0;
fin>>S>>n>>e;
int p=1,k=0;
while(p*e<=S && k<n
{
p=p*e;
k++;
}
while(S>0)
{
if(S>=p) fout<<S/p<<" bancnote de valoarea "<<p<<endl;
t=t+S/p;
S=S % p;
p=p/e;
}
fout<<t;
fin.close();
fout.close();
return 0;
}
8.Fiind dată o tabla de șah de dimensiunea n × n și un cal în colțul stânga sus al acesteia,
se cere să se deplaseze calul pe tablă astfel încât să treacă o singură dată prin fiecare pătrat al
tablei.
#include<fstream>
#include<iomanip>
using namespace std;
const int dx[8]={-1,1,2,2,1,-1,-2,-2};
const int dy[8]={-2,-2,-1,1,2,2,1,-1};
int a[201][201],n,ok;
ifstream fin("date.in");
ofstream fout("date.out");
void afis()
{ int i,j;
fout<<"n="<<n<<endl;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++) fout<<setw(4)<<a[i][j]<<" ";
fout<<endl;
}
fout<<endl;
ok=1;
}
int main()
{ fin>>n;
greedy(1,1,1);
fout.close();
return 0;
}