Cod sursa(job #1348500)

Utilizator assa98Andrei Stanciu assa98 Data 19 februarie 2015 18:51:03
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <deque>
#include <algorithm>
using namespace std;

ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");

const int MAX_G = 75000;
const int MAX_N = 20100;
const int MAX_VAL = 210;
const int INF = MAX_N;

int v[MAX_VAL];
int d[2][MAX_G+100];

void dinamic(int g) {
    for(int i = 0; i <= g; i++) {
        d[0][i] = d[1][i] = INF;
    }

    d[0][0] = 0;

    for(int i = 1; i <= 200; i++) {
        if(!v[i]) {
            continue;
        }

        for(int r = 0; r < i; r++) {
            deque<int> Q;
            for(int j = r; j <= g; j += i) {
                d[1][j] = d[0][j];
                if(!Q.empty()) {
                    d[1][j] = min(d[1][j], d[0][Q.front()] + (j - Q.front()) / i);
                }
                while(!Q.empty() && d[0][j] <= d[0][Q.back()]) {
                    Q.pop_back();
                }
                if(d[0][j] != INF) {
                    Q.push_back(j);
                }
                while(!Q.empty() && (j - Q.front()) / i >= v[i]) {
                    Q.pop_front();
                }
            }
        }

        for(int j = 0; j <= g; j++) {
            d[0][j] = d[1][j];
            d[1][j] = INF;
        }
    }
}


int main() {
    int n, g;
    fin >> n >> g;
    for(int i=1;i<=n;i++) {
        int a;
        fin >> a;
        v[a]++;
    }

    dinamic(g);

    for(int i = g; i >= 0; i--) {
        if(d[0][i] != INF) {
            fout << i << ' ' << d[0][i] << '\n';
            for(int j = 1; j <= d[0][i]; j++) {
                fout << 0 << '\n';
            }
            return 0;
        }
    }

    return 0;
}