Cod sursa(job #164906)

Utilizator sims_glAlexandru Simion sims_gl Data 24 martie 2008 22:29:04
Problema Popandai Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define nm 310
#define xx first
#define yy second
#define inf 100

int n, m, nr[nm][nm];
double st[nm], dr[nm], sol = inf;
vector< pair<int, int> > v;

inline int abs(int x)
{
	if (x < 0)
		return -x;
	return x;
}

inline int det(int i, int j, int k)
{
	return v[i].xx * v[j].yy + v[j].xx * v[k].yy + v[k].xx * v[i].yy - v[i].xx * v[k].yy - v[j].xx * v[i].yy - v[k].xx * v[j].yy;
}

int cate(int i, int j, int k)
{
	if (det(i, j, k) < 0)
		return abs(nr[i][j] + nr[j][k] - nr[i][k]);
	else
		return abs(nr[i][k] - nr[i][j] - nr[j][k] - 1);
}

double arie(int i, int j, int k)
{
	return 0.5 * abs(det(i, j, k));
}

double min(double a, double b)
{
	if (a < b)
		return a;
	return b;
}

int main()
{
	freopen("popandai.in", "r", stdin);
	freopen("popandai.out", "w", stdout);

	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; ++i) {
		int x, y;

		scanf("%d%d", &x, &y);
		v.push_back(make_pair(x, y));
	}

	sort(v.begin(), v.end());
/*
	for (int i = 0; i < n; ++i)
		printf("%d %d\n", v[i].xx, v[i].yy);
	printf("\n");
*/
	for (int i = 0; i < n; ++i)
		for (int j = i + 1; j < n; ++j) 
			if (v[i].xx != v[j].xx) {
				int a = v[j].yy - v[i].yy, b = v[i].xx - v[j].xx, c = -b * v[i].yy - a * v[i].xx;

				for (int k = 0; k < n; ++k)
					if (v[i].xx <= v[k].xx && v[k].xx <= v[j].xx && a * v[k].xx + b * v[k].yy + c > 0)
						++nr[i][j];

				nr[j][i] = nr[i][j];
			}
/*
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j)
			printf("%d ", nr[i][j]);
		printf("\n");
	}
	printf("\n");
*/
	for (int i = 0; i < n; ++i)
		for (int j = i + 1; j < n; ++j) {
			int a = v[j].yy - v[i].yy, b = v[i].xx - v[j].xx, c = v[i].yy - a * v[i].xx;

			for (int k = 0; k <= n; ++k)
				st[k] = dr[k] = inf;

			for (int k = 0; k < n; ++k)
				if (k != i && k != j) {
					int temp = cate(i, j, k);
					double area = arie(i, j, k);

					if (a * v[k].xx + b * v[k].yy + c < 0 && st[temp] > area)
						st[temp] = area;
					else if (a * v[k].xx + b * v[k].yy + c > 0 && dr[temp] > area)
						dr[temp] = area;
				}

			for (int k = n - 1; k >= 0; --k) {
				st[k] = min(st[k], st[k + 1]);
				dr[k] = min(dr[k], dr[k + 1]);
			}

			for (int k = 0; k <= m; ++k)
				if (sol > st[k] + dr[m - k])
					sol = st[k] + dr[m - k];
		}
/*
	for (int i = 0; i < n; ++i)
		for (int j = i + 1; j < n; ++j)
			for (int k = j + 1; k < n; ++k)
				printf("%d %d %d  %d  %d\n", i, j, k, cate(i, j, k), det(i, j, k));
	printf("\n");
*/
	printf("%.1lf\n", sol);

	return 0;
}