Pagini recente » Cod sursa (job #1938908) | Cod sursa (job #1267575) | Cod sursa (job #2620536) | Cod sursa (job #2211002) | Cod sursa (job #754062)
Cod sursa(job #754062)
#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,Best[MaxN],sol=INF;
short int D[MaxN][MaxN];
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)
{
if(Det(P[p1],P[p3],P[p2])<0)
{
return D[p1][p3]-D[p1][p2]-D[p2][p3]-1;
}
else
{
return D[p1][p2]+D[p2][p3]-D[p1][p3];
}
}
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;
}