Pagini recente » Cod sursa (job #3193787) | Cod sursa (job #2188143) | Profil Petre_Timotei | Cod sursa (job #3269084) | Cod sursa (job #1337966)
#include <fstream>
#include <algorithm>
#include <iomanip>
#define Nmax 305
using namespace std;
ofstream fout ("popandai.out");
const long double INF=2000000000;
struct el
{
int nr;
long double aria;
} v1[Nmax],v2[Nmax];
struct Point
{
int x,y;
bool operator <(const Point A) const
{
return x<A.x;
}
} a[Nmax];
int pc[Nmax][Nmax],n,len1,len2,segm[Nmax];
long double minim[Nmax];
inline long long Semn(Point A, Point B, Point C)
{
return (1LL*(B.y-A.y)*C.x + 1LL*(A.x-B.x)*C.y + 1LL*B.x*A.y - 1LL*A.x*B.y);
}
inline long double Arie(Point A, Point B, Point C)
{
return 0.5*(double)abs(1LL*A.x*B.y + 1LL*B.x*C.y + 1LL*C.x*A.y - 1LL*C.x*B.y - 1LL*A.x*C.y - 1LL*B.x*A.y);
}
inline int Trapez(int A, int B, int C)
{
if(a[C].x>=a[A].x && a[C].x<=a[B].x) swap(C,B);
else
if(a[C].x<a[A].x)
{
swap(A,C); swap(B,C);
}
if(Semn(a[A],a[C],a[B])>0)
{
int aux;
if(a[B].x>a[A].x && a[B].x<a[C].x) aux=segm[B];
else aux=0;
return pc[A][C]-pc[A][B]-pc[B][C]-aux;
}
else return pc[A][B]+pc[B][C]-pc[A][C];
}
inline void Prec()
{
int i,j;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
if(a[j].x==a[i].x && a[j].y<=a[i].y) ++segm[i];
}
int main()
{
int i,j,k,nr;
long double sol=INF;
el w;
ifstream fin ("popandai.in");
fin>>n>>nr;
for(i=1;i<=n;++i) fin>>a[i].x>>a[i].y;
sort(a+1,a+n+1);
Prec();
for(i=1;i<=n;++i)
for(j=i+1;j<=n;++j)
for(k=1;k<=n;++k)
if(a[k].x>a[i].x && a[k].x<a[j].x && a[k].y>0 && Semn(a[i],a[j],a[k])>0)
{
++pc[i][j];
++pc[j][i];
}
for(i=1;i<=n;++i)
for(j=i+1;j<=n;++j) /// AICI !!!!!!!
{
long long aux;
for(k=1,len1=len2=0;k<=n;++k)
{
aux=Semn(a[i],a[j],a[k]);
if(aux>0)
{
w.aria=Arie(a[i],a[j],a[k]);
w.nr=Trapez(i,j,k);
v1[++len1]=w;
}
else
if(aux<0)
{
w.aria=Arie(a[i],a[j],a[k]);
w.nr=Trapez(i,j,k);
v2[++len2]=w;
}
}
for(k=0;k<=n;++k) minim[k]=INF;
for(k=1;k<=len2;++k) minim[v2[k].nr]=min(minim[v2[k].nr],v2[k].aria);
for(k=n-1;k>=0;--k) minim[k]=min(minim[k+1],minim[k]);
for(k=1;k<=len1;++k)
sol=min(sol,minim[max(nr-v1[k].nr,0)]+v1[k].aria);
}
fout<<setprecision(2)<<fixed<<sol<<"\n";
return 0;
}