Pagini recente » Cod sursa (job #28053) | Cod sursa (job #3191010) | Cod sursa (job #1505643) | Cod sursa (job #3141592) | Cod sursa (job #784864)
Cod sursa(job #784864)
#include <fstream>
#include <algorithm>
#include<iomanip>
#define maxn 410
using namespace std;
ifstream fin("popandai.in");
ofstream fout("popandai.out");
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];
int cmp(punct a, punct b)
{
return a.x<b.x;
}
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()
{
fin>>n>>q;
for(i=1; i<=n; i++)
{
fin>>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] && sus[q-k]!=1000000010 && jos[k]!=1000000010)
{
sol=sus[q-k]+jos[k];
}
}
}
}
//fout<<float(sol/2);
float solutie=sol;
fout<<setprecision(1)<<solutie/2;
return 0;
}