Pagini recente » Cod sursa (job #2931383) | Cod sursa (job #43196) | Cod sursa (job #1444105) | Cod sursa (job #845031) | Cod sursa (job #1734467)
#include<cstdio>
#include<algorithm>
#define MAXN 310
#define INF 1000000000.0
using namespace std;
struct Point{
int x;
int y;
};
Point v[MAXN];
int dp[MAXN][MAXN];
double under[MAXN],over[MAXN];
bool PointCompare(Point a,Point b){
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int Determinant(int a,int b,int c){
return v[a].x*v[b].y+v[b].x*v[c].y+v[c].x*v[a].y-v[a].x*v[c].y-v[b].x*v[a].y-v[c].x*v[b].y;
}
int main(){
freopen("popandai.in","r",stdin);
freopen("popandai.out","w",stdout);
int n,k,i,j,l,a,b,c,points;
double answer=INF,current,d;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%d%d",&v[i].x,&v[i].y);
sort(v+1,v+n+1,PointCompare);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
for(l=j+1;l<=n;l++)
if(Determinant(i,j,l)<0){
dp[i][l]++;
dp[l][i]++;
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++){
for(l=0;l<=n+1;l++)
under[l]=over[l]=INF;
current=INF;
for(l=1;l<=n;l++)
if(l!=i&&l!=j){
a=i;
b=j;
c=l;
d=Determinant(i,j,l);
if(v[a].x>v[b].x)
swap(a,b);
if(v[a].x>v[c].x)
swap(a,c);
if(v[b].x>v[c].x)
swap(b,c);
points=dp[a][b]+dp[b][c]-dp[a][c];
if(points<0)
points=-points-1;
if(d>0)
under[points]=min(under[points],d);
else
over[points]=min(over[points],-d);
}
for(l=n;l>=0;l--){
under[l]=min(under[l],under[l+1]);
over[l]=min(over[l],over[l+1]);
}
for(l=0;l<=k;l++)
current=min(current,under[l]+over[k-l]);
answer=min(answer,current);
}
printf("%.2f",answer/2.0);
return 0;
}