Cod sursa(job #754059)

Utilizator ChallengeMurtaza Alexandru Challenge Data 31 mai 2012 13:17:24
Problema Popandai Scor 64
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#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;
}