Cod sursă (job #435543)

Utilizator avatar tziplea_stefan Tiplea Stefan Alexandru tziplea_stefan IP ascuns
Problemă Canibali (lot liceu) Compilator cpp | 1,98 kb
Rundă Arhiva de probleme Status evaluat
Dată 14 feb. 2019 01:17:22 Scor 100
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("canibali.in");
ofstream fout("canibali.out");

const int VAL=7005;

struct CANIBAL
{
    int X, Y, Z, T;
};

CANIBAL C[VAL];

int N, i, j, ANS;
int L[VAL], R[VAL];
bool nemodif, tried[VAL];
vector <int> G[VAL];

bool CMP(CANIBAL A, CANIBAL B)
{
    int nr=0;
    if (A.X>=B.X)
        nr++;
    if (A.Y>=B.Y)
        nr++;
    if (A.Z>=B.Z)
        nr++;
    if (A.T>=B.T)
        nr++;
    return nr==4;
}

bool operator ==(const CANIBAL &A, const CANIBAL &B)
{
    int nr=0;
    if (A.X==B.X)
        nr++;
    if (A.Y==B.Y)
        nr++;
    if (A.Z==B.Z)
        nr++;
    if (A.T==B.T)
        nr++;
    return nr==4;
}

bool PairUp(int nod)
{
    if (tried[nod]==true)
        return false;
    tried[nod]=true;
    vector <int> :: iterator it;
    for (it=G[nod].begin(); it!=G[nod].end(); it++)
    {
        if (L[*it]==0)
        {
            R[nod]=*it;
            L[*it]=nod;
            return true;
        }
    }
    for (it=G[nod].begin(); it!=G[nod].end(); it++)
    {
        if (PairUp(L[*it])==true)
        {
            R[nod]=*it;
            L[*it]=nod;
            return true;
        }
    }
    return false;
}

int main()
{
    fin >> N;
    for (i=1; i<=N; i++)
        fin >> C[i].X >> C[i].Y >> C[i].Z >> C[i].T;
    for (i=1; i<=N; i++)
    {
        for (j=1; j<=N; j++)
        {
            if (i==j)
                continue;
            if (C[i]==C[j] && j<i)
                continue;
            if (CMP(C[i], C[j])==true)
            {
                G[i].push_back(j);
                G[N+i].push_back(j);
            }
        }
    }
    while (nemodif==false)
    {
        nemodif=true;
        for (i=1; i<=2*N; i++)
            tried[i]=false;
        for (i=1; i<=2*N; i++)
            if (R[i]==0 && PairUp(i)==true)
                nemodif=false;
    }
    for (i=1; i<=N; i++)
        if (L[i]>0)
            ANS++;
    fout << N-ANS << '\n';
    fin.close();
    fout.close();
    return 0;
}