Pagini recente » Cod sursa (job #239481) | Cod sursa (job #682782) | Cod sursa (job #1994458) | Cod sursa (job #3167617) | Cod sursa (job #2937938)
/// Preset de infoarena
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("popandai.in");
ofstream fout("popandai.out");
const int maxN = 305, inf = 0x3f3f3f3f;
int n, p, ans, nr_pct[maxN][maxN], best_sus[maxN], best_jos[maxN];
struct point {
int x, y;
bool operator < (const point &other) const {
if(x == other.x)
return y < other.y;
return x < other.x;
}
}pct[maxN];
int arie(point a, point b, point c)
{
/// ax ay 1 )
/// bx by 1 ) => d = ax * by + ay * cx + bx * cy - by * cx - ay * bx - ax * cy
/// cx cy 1 )
return a.x * b.y + a.y * c.x + b.x * c.y - b.y * c.x - a.y * b.x - a.x * c.y;
}
int get_nr_pct(int a, int b, int c)
{
if(pct[a].x > pct[b].x)
swap(a, b);
if(pct[a].x > pct[c].x)
swap(a, c);
if(pct[b].x > pct[c].x)
swap(b, c);
if(arie(pct[a], pct[b], pct[c]) < 0)
return nr_pct[a][b] + nr_pct[b][c] - nr_pct[a][c];
else
return nr_pct[a][c] - nr_pct[a][b] - nr_pct[b][c] - 1;
}
int main()
{
fin >> n >> p;
for(int i = 1; i <= n; i++)
fin >> pct[i].x >> pct[i].y;
sort(pct + 1, pct + n + 1);
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
for(int k = 1; k <= n; k++)
if(pct[i].x <= pct[k].x && pct[k].x <= pct[j].x && arie(pct[i], pct[j], pct[k]) < 0)
nr_pct[i][j]++;
nr_pct[j][i] = nr_pct[i][j];
}
}
best_jos[n + 1] = -inf;
best_sus[n + 1] = inf;
ans = inf;
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
for(int k = 0; k <= n; k++)
{
best_jos[k] = -inf;
best_sus[k] = inf;
}
for(int k = 1; k <= n; k++)
{
int nr = get_nr_pct(i, j, k), a = arie(pct[i], pct[j], pct[k]);
if(a < 0)
best_jos[nr] = max(best_jos[nr], a);
else
best_sus[nr] = min(best_sus[nr], a);
}
for(int k = n; k >= 0; k--)
{
best_jos[k] = max(best_jos[k], best_jos[k + 1]);
best_sus[k] = min(best_sus[k], best_sus[k + 1]);
}
for(int k = 0; k <= p; k++)
{
//fout << best_sus[k] << ' ' << best_jos[p - k] << '\n';
ans = min(ans, best_sus[k] - best_jos[p - k]);
}
}
}
fout << ans/2;
if(ans % 2 == 0)
fout << ".0";
else
fout << ".5";
return 0;
}