Răspuns :
Ecuatia generala a unei drepte este y=m*x+b unde (x,y) sunt coordonatele unui punct de pe dreapta, m este panta dreptei si b este deplasarea dreptei fata de origine.
Cum la noi scrie ca toate dreptele trec prin originea planului O(0,0) atunci punctul respectiv apartine tuturor dreptelor cu formula de mai sus adica pentru x=0 si y=0 aven atunci
0=m*0+b adica b=0
Deci deplasarea va fi intotdeauna 0, inseamna ca ecuatia dreptei va deveni
y=m*x. Deci dreptele sunt definite doar prin panta lor m.
Putem face 2 structuri
1) Structura cercului care sa contina coordonatele centrului cercului (x,y) si raza r
2) Structura dreptei care contine: panta dreptei, lista de structuri de cerc care au centrul cercului pe acea dreapta, si numarul de centre de pe dreapta
2 cercuri exterioare nu trebuie sa se atinga sau sa se suprapuna unul pe celalalt. Stim ca dreptele unesc centrele a doua cercuri. Deci o dreapta va contine in mod automat si razele individuale ale celor doua cercuri. Sa zicem ca avem cercurile cu razele r1,r2 si distanta d dintre cercuri. Avem urmatoarele situatii
a) Cercuri suprapuse: r1+r2>d
b) Cercuri tangente: r1+r2=d
c) Cercuri exterioare r1+r2<d
Deci noi o sa verificam conditia c)
Programul pe care l-am scris este mai degraba educativ si nu va aduce punctaj mare. Am adaugat si linii care sa iti afiseze niste pasi intermediari. Sper sa te ajute
Cum la noi scrie ca toate dreptele trec prin originea planului O(0,0) atunci punctul respectiv apartine tuturor dreptelor cu formula de mai sus adica pentru x=0 si y=0 aven atunci
0=m*0+b adica b=0
Deci deplasarea va fi intotdeauna 0, inseamna ca ecuatia dreptei va deveni
y=m*x. Deci dreptele sunt definite doar prin panta lor m.
Putem face 2 structuri
1) Structura cercului care sa contina coordonatele centrului cercului (x,y) si raza r
2) Structura dreptei care contine: panta dreptei, lista de structuri de cerc care au centrul cercului pe acea dreapta, si numarul de centre de pe dreapta
2 cercuri exterioare nu trebuie sa se atinga sau sa se suprapuna unul pe celalalt. Stim ca dreptele unesc centrele a doua cercuri. Deci o dreapta va contine in mod automat si razele individuale ale celor doua cercuri. Sa zicem ca avem cercurile cu razele r1,r2 si distanta d dintre cercuri. Avem urmatoarele situatii
a) Cercuri suprapuse: r1+r2>d
b) Cercuri tangente: r1+r2=d
c) Cercuri exterioare r1+r2<d
Deci noi o sa verificam conditia c)
Programul pe care l-am scris este mai degraba educativ si nu va aduce punctaj mare. Am adaugat si linii care sa iti afiseze niste pasi intermediari. Sper sa te ajute
#include <bits/stdc++.h>
#define maxN 2004 //nimeni altu
using namespace std;
const int INF=(1<<30);
struct point
{
double x,y,r;
double _tan;
double first,last;
}v[maxN];
bool cmp(const point &a,const point &b)
{
if(a._tan==b._tan)
return a.last<b.last;
return a._tan<b._tan;
}
int n,i,j,lines=1,maxc,currc,nr,ind;
int main()
{
freopen("cerc4.in","r",stdin);
freopen("cerc4.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf %lf %lf",&v[i].x,&v[i].y,&v[i].r);
for(i=1;i<=n;i++)
if(v[i].y!=0)
v[i]._tan=v[i].x/v[i].y;
else v[i]._tan=INF;
for(i=1;i<=n;i++)
{
double aux=sqrt(v[i].x*v[i].x+v[i].y*v[i].y);
v[i].first=aux-v[i].r;
v[i].last=aux+v[i].r;
}
sort(v+1,v+n+1,cmp);
maxc=1,nr=1,currc=1,ind=1;
for(i=2;i<=n;i++)
{
if(v[i]._tan!=v[i-1]._tan)
{
lines++;
currc=1;
if(maxc==currc)
nr++;
ind=i;
}
else if(v[i].first>v[ind].last)
{
currc++;
if(currc>maxc)
maxc=currc,nr=1;
else if(currc==maxc)
nr++;
ind=i;
}
}
printf("%d %d %d",lines,maxc,nr);
return 0;
}
#define maxN 2004 //nimeni altu
using namespace std;
const int INF=(1<<30);
struct point
{
double x,y,r;
double _tan;
double first,last;
}v[maxN];
bool cmp(const point &a,const point &b)
{
if(a._tan==b._tan)
return a.last<b.last;
return a._tan<b._tan;
}
int n,i,j,lines=1,maxc,currc,nr,ind;
int main()
{
freopen("cerc4.in","r",stdin);
freopen("cerc4.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf %lf %lf",&v[i].x,&v[i].y,&v[i].r);
for(i=1;i<=n;i++)
if(v[i].y!=0)
v[i]._tan=v[i].x/v[i].y;
else v[i]._tan=INF;
for(i=1;i<=n;i++)
{
double aux=sqrt(v[i].x*v[i].x+v[i].y*v[i].y);
v[i].first=aux-v[i].r;
v[i].last=aux+v[i].r;
}
sort(v+1,v+n+1,cmp);
maxc=1,nr=1,currc=1,ind=1;
for(i=2;i<=n;i++)
{
if(v[i]._tan!=v[i-1]._tan)
{
lines++;
currc=1;
if(maxc==currc)
nr++;
ind=i;
}
else if(v[i].first>v[ind].last)
{
currc++;
if(currc>maxc)
maxc=currc,nr=1;
else if(currc==maxc)
nr++;
ind=i;
}
}
printf("%d %d %d",lines,maxc,nr);
return 0;
}