Pagini recente » Cod sursa (job #2149202) | Cod sursa (job #2856271) | Cod sursa (job #1696391) | Cod sursa (job #3164806) | Cod sursa (job #341475)
Cod sursa(job #341475)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 310
struct punct
{
long x;
long y;
};
long n, i, j, k, q, m, sol;
long p[maxn][maxn], nrp;
long sus[maxn], jos[maxn];
punct v[maxn];
inline int cmp(punct a, punct b)
{
if(a.x!=b.x) return a.x<b.x;
return a.y>b.y;
}
long det(long a, long b, long 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;
}
long aria(long a, long b, long c)
{
long ar=det(a, b, c);
if(ar<0) return -ar;
return ar;
}
int main()
{
freopen("popandai.in", "r", stdin);
freopen("popandai.out", "w", stdout);
scanf("%d%d", &n, &q);
for(i=1; i<=n; i++)
{
scanf("%d%d", &v[i].x, &v[i].y);
}
sort(v+1, v+n+1, cmp);
for(i=1; i<=n; i++)
{
for(j=i+2; j<=n; j++)
{
for(k=i+1; k<j; k++)
{
if(det(i, j, k)<0)
{
p[i][j]++;
p[j][i]++;
}
}
}
}
sol=2000000010;
for(i=1; i<=n; i++)
{
for(j=i+1; j<=n; j++)
{
for(k=0; k<=n; k++)
{
sus[k]=jos[k]=1000000010;
}
for(k=1; k<=n; k++)
{
if(k==i || k==j) continue;
if(det(i, j, k)<0)
{
if(v[k].x<v[i].x)
{
nrp=p[i][j]+p[i][k]-p[j][k];
}
else
if(v[k].x>v[j].x)
{
nrp=p[i][j]+p[j][k]-p[i][k];
}
else
{
nrp=p[i][j]-p[i][k]-p[j][k]-1;
}
if(aria(i, j, k)<jos[nrp])
{
jos[nrp]=aria(i, j, k);
}
}
else
{
if(v[k].x<v[i].x)
{
nrp=p[j][k]-p[i][j]-p[i][k]-1;
}
else
if(v[k].x>v[j].x)
{
nrp=p[i][k]-p[i][j]-p[j][k]-1;
}
else
{
nrp=p[i][k]-p[i][j]+p[j][k];
}
if(aria(i, j, k)<sus[nrp])
{
sus[nrp]=aria(i, j, k);
}
}
}
m=sus[n];
for(k=n; k>=0; k--)
{
if(m>sus[k]) m=sus[k];
sus[k]=m;
}
m=jos[n];
for(k=n; k>=0; k--)
{
if(m>jos[k]) m=jos[k];
jos[k]=m;
}
for(k=0; k<=q; k++)
{
if(sol>sus[q-k]+jos[k])
{
sol=sus[q-k]+jos[k];
}
}
}
}
printf("%.1lf\n", (double)sol/2);
return 0;
}