Cod sursa(job #2361181)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 2 martie 2019 13:39:28
Problema Ghiozdan Scor 6
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 2.e9;
int v[20005] , ans[20005];
struct ghiozdan
{
    int nr , last;
};
ghiozdan g[75005];
int main()
{
    freopen("ghiozdan.in" , "r" , stdin);
    freopen("ghiozdan.out" , "w" , stdout);
    int n , gmax , i , j , last , aux , maxg , nmin , gasit;
    scanf("%d%d" , &n , &gmax);
    for(i = 1 ; i <= n ; i ++)
        scanf("%d" , &v[i]);
    for(i = 1 ; i <= gmax ; i ++)
        g[i].nr = INF;
    last = 0;
    for(i = 1 ; i <= n ; i ++)
    {
        aux = 0;
        for(j = last ; j >= 0 ; j --)
            if(g[j + v[i]].nr > g[j].nr + 1)
            {
                g[j + v[i]].nr = g[j].nr + 1;
                g[j + v[i]].last = i;
                aux = max(aux , j + v[i]);
            }
        last = aux;
    }
    gasit = 0;
    for(i = gmax ; i >= 1 ; i --)
    {
        if(g[i].nr != INF && gasit == 0)
        {
            maxg = i;
            nmin = g[i].nr;
            ans[++ ans[0]] = g[i].last;
            aux = i - v[g[i].last];
            gasit = 1;
        }
        else if(i == aux)
        {
            ans[++ ans[0]] = g[i].last;
            aux = i - v[g[i].last];
        }
        //printf("%d %d %d\n" , i , g[i].nr , g[i].last);
    }
    printf("%d %d\n" , maxg , nmin);
    for(i = 1 ; i <= ans[0] ; i ++)
        printf("%d\n" , v[ans[i]]);
    return 0;
}