Pagini recente » Cod sursa (job #1943226) | Cod sursa (job #971327) | Cod sursa (job #2130034) | Cod sursa (job #918491) | Cod sursa (job #754059)
Cod sursa(job #754059)
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;
const char InFile[]="popandai.in";
const char OutFile[]="popandai.out";
const int MaxN=305;
const double INF=(1LL<<31)-1;
ifstream fin(InFile);
ofstream fout(OutFile);
struct Point
{
Point(int x=0, int y=0):x(x),y(y){}
int x,y;
};
struct Point_CMP
{
inline bool operator() (const Point &A, const Point &B)
{
return A.x<B.x;
}
};
int N,K,D[MaxN][MaxN],Best[MaxN],sol=INF;
Point P[MaxN];
inline int Det(const Point &A, const Point &B, const Point &C)
{
return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);
}
inline int MyAbs(const int &X)
{
if(X<0)
{
return -X;
}
return X;
}
inline int Arie(const Point &A, const Point &B, const Point &C)
{
return MyAbs(Det(A,B,C));
}
inline int Query(const int &p1, const int &p2, const int &p3)
{
int p[3];
p[0]=p1;
p[1]=p2;
p[2]=p3;
sort(p,p+3);
int sol;
if(Det(P[p[0]],P[p[2]],P[p[1]])<0)
{
sol=D[p[0]][p[2]]-D[p[0]][p[1]]-D[p[1]][p[2]]-1;
}
else
{
sol=D[p[0]][p[1]]+D[p[1]][p[2]]-D[p[0]][p[2]];
}
return sol;
}
int main()
{
fin>>N>>K;
for(register int i=1;i<=N;++i)
{
fin>>P[i].x>>P[i].y;
}
fin.close();
sort(P+1,P+1+N,Point_CMP());
for(register int i=1;i<=N;++i)
{
for(register int j=i+1;j<=N;++j)
{
for(register int k=i+1;k<j;++k)
{
if(Det(P[i],P[j],P[k])<0)
{
++D[i][j];
}
}
}
}
for(register int i=1;i<=N;++i)
{
for(register int j=i+1;j<=N;++j)
{
for(register int k=0;k<=N;++k)
{
Best[k]=INF;
}
for(register int k=1;k<=N;++k)
{
if(Det(P[i],P[j],P[k])<0 && k!=i && k!=j)
{
int pct=Query(i,j,k);
Best[pct]=min(Best[pct],Arie(P[i],P[j],P[k]));
}
}
for(register int k=N-1;k>=0;--k)
{
Best[k]=min(Best[k],Best[k+1]);
}
for(register int k=1;k<=N;++k)
{
if(Det(P[i],P[j],P[k])>0 && k!=i && k!=j)
{
int pct=Query(i,j,k);
if(K-pct<0)
{
pct=0;
}
if(Best[K-pct]==INF)
{
continue;
}
sol=min(sol,Arie(P[i],P[j],P[k])+Best[K-pct]);
}
}
}
}
fout<<fixed<<setprecision(1)<<(double)(sol)*0.5;
fout.close();
return 0;
}