Pagini recente » Cod sursa (job #1833237) | Cod sursa (job #3237570) | Cod sursa (job #3123002) | Cod sursa (job #3232439) | Cod sursa (job #167363)
Cod sursa(job #167363)
#include <stdio.h>
#include <algorithm>
const long long inf = (long long) 1 << 60;
#define x first
#define y second
using namespace std;
pair<long long, long long> p[310];
int n, k, nr[310][310];
long long u[310], d[310], sol;
int used[2][60000];
long long area(int i, int j, int l)
{
return (p[i].x * p[j].y + p[j].x * p[l].y + p[l].x * p[i].y - p[i].x * p[l].y - p[j].x * p[i].y - p[l].x * p[j].y) / 2;
}
long long modul(long long a)
{
if(a < 0)
return -a;
return a;
}
int main()
{
freopen("popandai.in", "r", stdin);
freopen("popandai.out", "w", stdout);
int i, j, l, temp, a;
scanf("%d %d", &n, &k);
for(i = 1; i <= n; ++i)
{
scanf("%lld %lld", &p[i].x, &p[i].y);
p[i].x *= 2;
if(used[0][p[i].x])
{
used[1][p[i].x] = p[i].y;
}
else
{
used[0][p[i].x] = p[i].y;
}
}
sort(p + 1, p + n + 1);
for(i = 1; i <= n; ++i)
{
for(j = i + 1; j <= n; ++j)
{
for(l = 1; l <= n; ++l)
{
if(p[l].x >= p[i].x && p[l].x <= p[j].x && area(i, j, l) < 0)
{
++nr[i][j];
}
}
}
}
//printf("%d %d %d\n", nr[4][6], nr[4][7], nr[6][7]);
sol = inf;
for(i = 1; i <= n; ++i)
{
for(j = i + 1; j <= n; ++j)
{
for(l = 0; l <= n; ++l)
{
u[l] = d[l] = inf;
}
for(l = 1; l <= n; ++l)
{
if(l != i && l != j)
{
if(area(i, j, l) > 0)
{
if(l > j)
{
temp = nr[i][l] - nr[j][l] - nr[i][j] - 1;
if(used[1][p[j].x] && (p[j].y > used[0][p[j].x] || p[j].y > used[1][p[j].x]))
++temp;
}
else if(l < i)
{
temp = nr[l][j] - nr[l][i] - nr[i][j] - 1;
if(used[1][p[i].x] && (p[i].y > used[0][p[i].x] || p[i].y > used[1][p[i].x]))
++temp;
}
else
{
temp = nr[i][l] + nr[l][j] - nr[i][j];
}
a = modul(area(i, j, l));
//printf("%d %d %d %d\n", i, j, l, temp);
if(u[temp] > a)
{
u[temp] = a;
}
}
else
{
if(l > j)
{
temp = nr[i][j] + nr[j][l] - nr[i][l];
}
else if(l < i)
{
temp = nr[l][i] + nr[i][j] - nr[l][j];
}
else
{
temp = nr[i][j] - nr[i][l] - nr[l][j] - 1;
if(used[1][p[l].x] && (p[l].y > used[0][p[l].x] || p[l].y > used[1][p[l].x]))
++temp;
}
// printf("%d %d %d %d\n", i, j, l, temp);
a = modul(area(i, j, l));
if(d[temp] > a)
{
d[temp] = a;
}
}
}
}
for(l = k - 1; l >= 0; --l)
{
if(u[l] > u[l + 1])
{
u[l] = u[l + 1];
}
if(d[l] > d[l + 1])
{
d[l] = d[l + 1];
}
}
for(l = 0; l <= k; ++l)
{
if(u[l] + d[k - l] < sol)
{
sol = u[l] + d[k - l];
}
}
}
}
if(sol % 2 == 0)
{
printf("%lld.0", sol / 2);
}
else
{
printf("%lld.5", sol / 2);
}
return 0;
}