Cod sursa(job #1734464)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 27 iulie 2016 14:09:06
Problema Popandai Scor 12
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<cstdio>
#include<algorithm>
#define MAXN 310
#define INF 2000000000.0
using namespace std;
struct Point{
    int x;
    int y;
};
Point v[MAXN];
int dp[MAXN][MAXN];
double under[MAXN],over[MAXN];
bool PointCompare(Point a,Point b){
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}
int Determinant(int a,int b,int 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;
}
int main(){
    freopen("popandai.in","r",stdin);
    freopen("popandai.out","w",stdout);
    int n,k,i,j,l,a,b,c,points;
    double answer=INF,current,d;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
        scanf("%d%d",&v[i].x,&v[i].y);
    sort(v+1,v+n+1,PointCompare);
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
            for(l=j+1;l<=n;l++)
                if(Determinant(i,j,l)<0){
                    dp[i][l]++;
                    dp[l][i]++;
                }
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++){
            for(l=0;l<=n+1;l++)
                under[l]=over[l]=INF;
            current=INF;
            for(l=1;l<=n;l++)
                if(l!=i&&l!=j){
                    a=i;
                    b=j;
                    c=l;
                    d=Determinant(i,j,l);
                    if(v[a].x>v[b].x)
                        swap(a,b);
                    if(v[b].x>v[c].x)
                        swap(b,c);
                    if(v[a].x>v[c].x)
                        swap(a,c);
                    points=dp[a][b]+dp[b][c]-dp[a][c];
                    if(points<0)
                        points=-points-1;
                    if(d>0)
                        under[points]=min(under[points],d);
                    else
                        over[points]=min(over[points],-d);
                }
            for(l=n;l>=0;l--){
                under[l]=min(under[l],under[l+1]);
                over[l]=min(over[l],over[l+1]);
            }
            for(l=0;l<=k;l++)
                current=min(current,under[l]+over[k-l]);
            answer=min(answer,current);
        }
    printf("%.2f",answer/2.0);
    return 0;
}