Pagini recente » Cod sursa (job #2015121) | Cod sursa (job #3041775) | Cod sursa (job #3281044) | Cod sursa (job #20747) | Cod sursa (job #2095992)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iomanip>
#define x first
#define y second
#define point pair<int,int>
using namespace std;
const int nmax=305;
pair<int,int> v[nmax];
int a[nmax][nmax],best[2][nmax];
double ans;
int n,Kn,i,j,k,ind,cate,where;
int det(point A,point B,point C)
{
return (A.x*B.y+B.x*C.y+C.x*A.y-A.y*B.x-B.y*C.x-C.y*A.x);
}
int under(point A,point B,point P)
{
if(A.x>B.x) swap(A,B);
if(P.x>A.x&&P.x<B.x)
{
return (det(A,B,P)<0);
}
return 0;
}
int in()
{
if(i<k&&k<j)
{
return abs(a[i][k]+a[k][j]-a[i][j])-under(v[i],v[j],v[k]);
}
if(k<i)
{
return abs(a[k][i]+a[i][j]-a[k][j])-under(v[j],v[k],v[i]);
}
if(k>j)
{
return abs(a[i][j]+a[j][k]-a[i][k])-under(v[i],v[k],v[j]);
}
return 0;
}
void prp(int &a,int b)
{
if(b<a)
a=b;
}
int main()
{
ifstream f("popandai.in");
ofstream g("popandai.out");
f>>n>>Kn;
for(i=1;i<=n;i++)
{
f>>v[i].x>>v[i].y;
}
sort(v+1,v+n+1);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
for(k=1;k<=n;k++)
if(i!=k&&k!=j&&under(v[i],v[j],v[k]))
{
a[i][j]++;
a[j][i]++;
}
ans=(1<<30);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
for(k=0;k<2;k++)
for(ind=0;ind<=Kn;ind++)
best[k][ind]=(1<<30)-1;
for(k=1;k<=n;k++)
if(k!=i&&k!=j)
{
cate=in();
where=(det(v[i],v[j],v[k])<0);
prp(best[where][min(cate,Kn)],abs(det(v[i],v[j],v[k])));
}
for(k=0;k<2;k++)
for(ind=Kn-1;ind>=0;ind--)
best[k][ind]=min(best[k][ind],best[k][ind+1]);
for(ind=0;ind<=Kn;ind++)
{
if(best[0][ind]+best[1][Kn-ind]<ans)
ans=best[0][ind]+best[1][Kn-ind];
}
}
g<<fixed<<setprecision(1)<<ans/2;
return 0;
}