Cod sursa(job #3140115)

Utilizator NiffSniffCojocaru Calin Marcu NiffSniff Data 3 iulie 2023 20:53:33
Problema Ghiozdan Scor 100
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 2.22 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#include <vector>
using namespace std;
string file = "ghiozdan";
ifstream cin (file + ".in");
ofstream cout (file + ".out");
struct ura{
    short x,nr;
};
vector <ura> v[75001];
vector <int> available;
short obiecte[201], marimi[75001];
int g;
void efectuare_rucsac(short x, bool &ok)
{
    vector <int> temp;
    for (int greutate : available)
    {
        int y = greutate+x;
        if (y > g)
            continue;
        if (!marimi[y])
        {
            ok = 1;
            temp.push_back(y);
            v[y] = v[greutate];
            marimi[y] = marimi[greutate] + 1;
            if (v[y].back().x == x)
            {
                v[y].back().nr++;
            }
            else
            {
                v[y].push_back({x,1});
            }
        }
        else if (marimi[greutate] + 1 < marimi[y])
        {
            ok = 1;
            v[y] = v[greutate];
            marimi[y] = marimi[greutate] + 1;
            if (v[y].back().x == x)
            {
                v[y].back().nr++;
            }
            else
            {
                v[y].push_back({x,1});
            }
        }
    }
    for (int x : temp)
    {
        available.push_back(x);
    }
}
int main()
{
    short n,x;
    cin >> n >> g;
    for (int i=1; i<=n; i++)
    {
        cin >> x;
        obiecte[x]++;
    }
    for (short i=200; i>=1; i--)
    {
        bool ok;
        if (obiecte[i])
        {
            obiecte[i]--;
            efectuare_rucsac(i,ok);
            v[i] = {{i,1}};
            if (!marimi[i])
            {
                available.push_back(i);
            }
            marimi[i] = 1;
        }
        while (obiecte[i]--)
        {
            ok = 0;
            efectuare_rucsac(i,ok);
            if (!ok)
                break;
        }

    }
    for (int i=g; i>=1; i--)
    {
        if (marimi[i])
        {
            cout << i << ' ' << marimi[i];
            for (ura x : v[i])
            {
                while (x.nr--)
                {
                    cout << '\n' << x.x;
                }
            }
            break;
        }
    }
}