Pagini recente » Cod sursa (job #2044591) | Cod sursa (job #1832887) | Cod sursa (job #2799089) | Cod sursa (job #2860525) | Cod sursa (job #47434)
Cod sursa(job #47434)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#define NMAX 330
#define x first
#define y second
#define INF 666666
#define eps 0.0000001
#define MAX(a,b) (((a)-(b)>eps) ? (a):(b))
using namespace std;
int Under[NMAX][NMAX], N, K;
vector<pair<int,int> > P;
double Amax=INF, Up[NMAX], Down[NMAX];
double arie(int i, int j, int k)
{
return (0.5*(double)abs((P[i].x*P[j].y-P[j].x*P[i].y)+(P[j].x*P[k].y-P[k].x*P[j].y)+(P[k].x*P[i].y-P[i].x*P[k].y)));
}
int main()
{
int i, j, k, x, y, a, b, c, cate = 0;
double xjos, yjos, sup;
freopen("popandai.in", "r", stdin);
scanf("%d %d", &N, &K);
for (i = 1; i <= N; i++){
scanf("%d %d", &x, &y);
P.push_back(make_pair(x,y)); }
sort(P.begin(), P.end());
for (i = 0; i < N; i++)
for (j = i+1; j < N; j++)
{
for (k = 0; k < N; k++)
if ( (i!=k && j!=k) && (P[i].x <= P[k].x && P[k].x <= P[j].x) )
{
a = P[j].y-P[i].y; b = P[i].x-P[j].x; c = P[i].x*P[j].y-P[j].x*P[i].y;
Under[i][j] += ((P[k].x*a+P[k].y*b+c)<0);
}
Under[i][j] = Under[j][i];
}
for (i = 0; i < N; i++)
for (j = i+1; j < N; j++)
{
memset(Up,0,sizeof(Up));
memset(Down,0,sizeof(Down));
for (k = j+1; k < N; k++)
{
a = P[k].y-P[i].y; b = P[i].x-P[k].x; c = P[i].x*P[k].y-P[k].x*P[i].y;
if ( ((P[j].x*a+P[j].y*b+c)>=0) )
{
Down[ x=Under[i][k]-Under[i][j]-Under[j][k]-1 ] = MAX(arie(i,j,k),Down[ Under[i][k]-Under[i][j]-Under[j][k]-1 ]);
if (x < 0)
return 1;
}
else
{
Up[ x=Under[i][j]+Under[j][k]-Under[i][k] ] = MAX(arie(i,j,k),Up[ Under[i][j]+Under[j][k]-Under[i][k] ]);
if (x < 0)
return 1;
}
}
for (k = 0; k <= K; k++)
if ((Down[k]>eps && Up[K-k]>eps)&&(Amax > (Down[k]+Up[K-k])))
Amax = Down[k]+Up[K-k];
}
freopen("popandai.out", "w", stdout);
printf("%02lf\n", Amax);
return 0;
}