Cod sursa(job #2848385)

Utilizator Mihai7218Bratu Mihai-Alexandru Mihai7218 Data 12 februarie 2022 14:47:37
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
struct lapte
{
    int a, b, ti;
}v[101];
bool comp (lapte a, lapte b)
{
    if (a.a == b.a)
        return a.b > b.b;
    return a.a < b.a;
}
int n, i, j, L, tc, da[1001], outA[1001][1001], outB[1001][1001], db[1001], dA[1001], dB[1001], poza, pozb, mxa, mxb;
int main()
{
    fin >> n >> L; mxa = 1e2; mxb = 1e2;
    for (i = 1; i <= n; i++)
    {
        fin >> v[i].a >> v[i].b;
        v[i].ti = i;
        mxa = min (mxa, v[i].a);
        mxb = min (mxb, v[i].b);
    }
    sort (v+1, v+n+1, comp);
    poza = pozb = max (mxa, mxb)*L;
    for (i = 1; i <= n; i++)
    {
        for (j = 0; j <= min (max(poza, pozb), 1000); j++)
        {
            if (poza > pozb)
            {
                for (tc = j+v[i].a; tc <= min (max(poza, pozb), 1000); tc++)
                    dA[tc]++;
                j+=v[i].a;
                outA[v[i].ti][j] = 1;
            }
            else if (poza == pozb && v[i].a <= v[i].b)
            {
                for (tc = j+v[i].a; tc <= min (max(poza, pozb), 1000); tc++)
                    dA[tc]++;
                j+=v[i].a;
                outA[v[i].ti][j] = 1;
            }
            else
            {
                for (tc = j+v[i].b; tc <= min (max(poza, pozb), 1000); tc++)
                    dB[tc]++;
                j+=v[i].b;
                outB[v[i].ti][j] = 1;
            }
            for (int fi = poza; fi > 0; fi--)
                if (dA[fi] == L) poza = fi;
            for (int fi = pozb; fi > 0; fi--)
                if (dB[fi] == L) pozb = fi;
            j--;
        }
        for (j = 0; j <= min (max(poza, pozb), 1000); j++)
            da[j] = dA[j], db[j] = dB[j];
    }
    fout << max (poza, pozb) << "\n";
    for (i = 1; i <= n; i++)
    {
        int Ao = 0, Bo = 0;
        for (j = 1; j <= max(poza, pozb); j++)
            if (outA[i][j]) Ao++;
        for (j = 1; j <= max(poza, pozb); j++)
            if (outB[i][j]) Bo++;
        fout << Ao << " " << Bo << "\n";
    }
    return 0;
}