Cod sursa(job #2264124)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 19 octombrie 2018 20:17:58
Problema Popandai Scor 8
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<fstream>
#include<iomanip>
#include<algorithm>
#include<math.h>
#define x first
#define y second
using namespace std;
ifstream fi("popandai.in");
ofstream fo("popandai.out");
pair<int,int> A[305];
int n,k,i,j,ind,S[305][305];
long double rez,St[305],Dr[305];

bool checku(int i, int j, int k)
{
    if(A[k].x<A[i].x || A[k].x>A[j].x)
        return 0;
    int val;
    if(A[j].y==A[i].y)
        val=A[i].y;
    else
        val=((A[j].x-A[i].x)*(A[k].x-A[i].x))/(A[j].y-A[i].y)+A[i].y;
    return (val>=A[k].y);
}

bool checkst(int i, int j, int k)
{
    int val;
    if(A[j].y==A[i].y)
        val=A[i].y;
    else
        val=((A[j].x-A[i].x)*(A[k].x-A[i].x))/(A[j].y-A[i].y)+A[i].y;
    return (val<A[k].y);
}

int getpoints(int i, int j, int k)
{
    if(k<i)
    {
        swap(k,j);
        swap(i,j);
    }
    if(k<j)
        swap(k,j);
    if(checku(i,k,j))
        return (S[i][k]-1-S[i][j]-S[j][k]);
    return (S[i][j]+S[j][k]-S[i][k]);
}

long double area(int i, int j, int k)
{
    return fabs(((A[i].x-A[k].x)*(A[j].y-A[i].y)-(A[i].x-A[j].x)*(A[k].y-A[i].y))/2.0);
}

int main()
{
    fi>>n>>k;
    for(i=1; i<=n; i++)
        fi>>A[i].x>>A[i].y;
    sort(A+1,A+n+1);
    for(i=1; i<n; i++)
        for(j=i+1; j<=n; j++)
            for(ind=1; ind<=n; ind++)
                if(ind!=i && ind!=j && checku(i,j,ind))
                    S[i][j]++;
    rez=1000000000.0;
    for(i=1; i<n; i++)
        for(j=i+1; j<=n; j++)
        {
            for(ind=0; ind<=k; ind++)
                St[ind]=Dr[ind]=1000000000.0;
            for(ind=1; ind<=n; ind++)
            {
                if(ind==i || ind==j)
                    continue;
                if(checkst(i,j,ind))
                    St[min(getpoints(i,j,ind),k)]=min(St[min(getpoints(i,j,ind),k)],area(i,j,ind));
                else
                    Dr[min(getpoints(i,j,ind),k)]=min(Dr[min(getpoints(i,j,ind),k)],area(i,j,ind));
            }
            for(ind=1; ind<=k; ind++)
                St[ind]=min(St[ind],St[ind-1]);
            for(ind=k-1; ind>=0; ind--)
                Dr[ind]=min(Dr[ind],Dr[ind+1]);
            for(ind=0; ind<=k; ind++)
                rez=min(rez,St[ind]+Dr[k-ind]);
        }
    fo<<setprecision(1)<<fixed<<rez<<"\n";
    fi.close();
    fo.close();
    return 0;
}