Cod sursa(job #2256382)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 8 octombrie 2018 16:23:05
Problema Popandai Scor 8
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#define INF 2000000000

using namespace std;
struct punct{
    int x,y;
};
punct v[301];
int d[301][301];
int sus[301],jos[301];
int cmp (punct a,punct b){
    if (a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}
int modul (int x){
    if (x<0)
        return -x;
    return x;
}
int arie (int a,int b,int c){
    return modul ((v[b].x-v[a].x) * (v[c].y-v[a].y) - (v[c].x-v[a].x) * (v[b].y-v[a].y));
}
int puncte (int i,int j,int k){
    int a,b,c;
    if (!cmp(v[i],v[j]))
        swap(i,j);
    if (!cmp(v[i],v[k]))
        swap(i,k);
    if (!cmp(v[j],v[k]))
        swap(j,k);
    a=v[i].y-v[j].y;
    b=v[j].x-v[i].x;
    c=v[i].x*(-a)-v[i].y*b;
    if (v[k].x * a + v[k].y * b + c<0 || v[j].x==v[i].x) /// caz cu varful in jos
        return (d[i][j]+d[j][k]-d[i][k]);
    else /// caz cu varful in sus
        return (d[i][k]-d[i][j]-d[j][k]- (v[j].x<v[k].x) );
}
int main()
{
    FILE *fin=fopen ("popandai.in","r");
    FILE *fout=fopen ("popandai.out","w");
    int n,i,j,a,b,c,kk,k,sol,nrp,ar;
    fscanf (fin,"%d%d",&n,&kk);
    for (i=1;i<=n;i++)
        fscanf (fin,"%d%d",&v[i].x,&v[i].y);
    sort (v+1,v+n+1,cmp); /// sort dupa x
    /// d[i][j] = cate puncte sunt sub segmentul i j
    for (i=1;i<n;i++){
        for (j=i+1;j<=n;j++){
            a=v[i].y-v[j].y;
            b=v[j].x-v[i].x;
            c=v[i].x*(-a)-v[i].y*b;
            for (k=1;k<=n;k++){
                if (k==i || k==j || v[k].x<v[i].x || v[k].x>=v[j].x)
                    continue;
                else if (v[k].x * a + v[k].y * b + c<0){ /// k e sub segmentul i j
                    d[i][j]++;
                    d[j][i]++;
                }

            }
            //printf ("%d %d %d %d %d\n",v[i].x,v[i].y,v[j].x,v[j].y,d[i][j]);
        }
    }

    /// acum incepe rezolvarea
    sol=INF;
    for (i=1;i<=n;i++){
        for (j=i+1;j<n;j++){
           // if (i==6)
             //   printf ("a");
            for (k=0;k<=kk;k++)
                sus[k]=jos[k]=INF;

            for (k=1;k<=n;k++){
                if (k==i || k==j)
                    continue;
                //if (puncte(i,j,k)<0)
                  //  printf ("%d\n",puncte(i,j,k));
                nrp=puncte (i,j,k); /// returneaza nr de puncte din triunghiul i j k
                ar=arie (i,j,k);
                a=v[i].y-v[j].y;
                b=v[j].x-v[i].x;
                c=v[i].x*(-a)-v[i].y*b;
                if (v[k].x * a + v[k].y * b + c<0)
                    jos[nrp]=min(jos[nrp],ar);
                else sus[nrp]=min(sus[nrp],ar);
            }
            for (k=kk;k;k--){
                jos[k]=min(jos[k],jos[k+1]);
                sus[k]=min(sus[k],sus[k+1]);
            }
            for (k=0;k<=kk;k++){
                //printf ("%d %d\n",jos[k],sus[k]);
                if (jos[k]!=INF && sus[kk-k]!=INF)
                    sol=min(sol,jos[k]+sus[kk-k]);
            }
        }
    }
    fprintf (fout,"%.1lf",(sol*1.0)/2);
    return 0;
}