Cod sursa(job #2407539)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 16 aprilie 2019 22:48:12
Problema Ghiozdan Scor 88
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("ghiozdan.in");
ofstream g("ghiozdan.out");
int N, W;
int frq[202];
int dp[80002], fw[80002], prv[80002];
bool gg[80002];
vector<int>ans;
int ct = -1;
int main()
{
    f >> N >> W;
    for(int i = 1; i <= N; ++i)
    {
        int x;
        f >> x;
        frq[x]++;
    }
    gg[0] = 1;
    for(int i = 1; i <= 201; ++i)
    {
        int mmx = 0;
        int noo = 0;
        int val = 0;
        for(int q = 0; q <= W; ++q)
        {
            if(!gg[q])
                continue;
            int mxx = min(frq[i], (W - q) / i);
            if(mxx * i + q > mmx)
                mmx = mxx * i + q, noo = mxx, val = dp[q] + mxx;
            else
                if(mxx * i + q == mmx && dp[q] + mxx < val)
                    mmx = mxx * i + q, noo = mxx, val = dp[q] + mxx;
        }
        int j = mmx;
        if(ct < j || (ct == j && val < ans.size()))
        {
            ans.clear();
            for(int r = 0; r < noo; ++r)
                ans.push_back(i);
            ct = j;
            j = j - noo * i;
            while(j)
            {
                for(int q = 1; q <= dp[j] - dp[fw[j]]; ++q)
                    ans.push_back((j - fw[j]) / (dp[j] - dp[fw[j]]));
                j = fw[j];
            }
        }
        int qt = 1;
        while(frq[i])
        {
            int nc = 0;
            if(frq[i] >= qt)
                nc = qt, frq[i] -= qt;
            else
                nc = frq[i], frq[i] = 0;
            for(int j = W - i * nc; j >= 0; --j)
                if(gg[j] && (!gg[j + i * nc] || dp[j] + nc < dp[j + i * nc]))
                {
                    gg[j + i * nc] = 1;
                    dp[j + i * nc] = dp[j] + nc;
                    fw[j + i * nc] = j;
                }
            qt *= 2;
        }
    }
    g << ct << " " << ans.size() << '\n';
    for(int i = 0; i < ans.size(); ++i)
        g << ans[i] << '\n';
    return 0;
}