Cod sursa(job #2849513)

Utilizator Mihai7218Bratu Mihai-Alexandru Mihai7218 Data 15 februarie 2022 11:54:01
Problema Ghiozdan Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
vector <int> out;
vector <map <int, int>> poz;
map <int, int> m;
int n, g, i, j, gr[20001], d[75001];
bool canBeAdded(int j, int gr)
{
    if (poz[j].find(gr) == poz[j].end())
        return 1;
    else if (poz[j][gr] < m[gr]) return 1;
    return 0;
}
int main()
{
    fin >> n >> g;
    for (i = 1; i <= n; i++)
    {
        fin >> gr[i];
        if (m.find(gr[i]) == m.end())
            m.insert ({gr[i], 1});
        else m[gr[i]]++;
    }
    for (i = 1; i <= g; i++)
        d[i] = 1e8;
    poz.resize(g+1);
    for (i = 1; i <= n; i++)
    {
        int ok = 1;
        for (j = g; j >= gr[i]; j--)
        {
            if (d[j] > d[j-gr[i]]+1 && canBeAdded(j, gr[i]))
            {
                poz[j] = poz[j-gr[i]];
                if (poz[j].find(gr[i]) == poz[j].end())
                    poz[j].insert({gr[i], 1});
                else poz[j][gr[i]]++;
                d[j] = d[j-gr[i]]+1;
                ok = 0;
            }
        }
    }
    for (i = g; i > 0; i--)
    {
        if (d[i] != 1e8)
        {
            fout << i << " " << d[i] << "\n";
            break;
        }
    }
    map <int, int>::iterator it;
    for (it = poz[i].begin(); it != poz[i].end(); it++)
    {
        for (j = 1; j <= (*it).second; j++)
            fout << (*it).first << "\n";
    }
    return 0;
}