Cod sursa(job #2035570)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 9 octombrie 2017 17:19:09
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<fstream>
#define DIM 75005
using namespace std;
int n, g, i, x;
int ff[205], d[2][DIM], t[2][DIM], dq[DIM];
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
void solve(int g, int st, int dr){
    if(st == dr){
        for(int i = 1; i <= g / st; i++){
            fout<< st <<"\n";
        }
        return;
    }
    int i, j, r, p, u, k = 1, mid = (st + dr) / 2;
    for(i = 1; i <= g; i++){
        d[0][i] = 100000000;
    }
    for(i = st; i <= dr; i++){
        for(r = 0; r < i; r++){
            p = 1;
            u = 0;
            for(j = r; j <= g; j += i){
                while(p <= u && d[1 - k][j] < d[1 - k][ dq[u] ] + (j - dq[u]) / i){
                    u--;
                }
                dq[++u] = j;
                if(dq[p] == j - (ff[i] + 1) * i){
                    p++;
                }
                d[k][j] = d[1 - k][ dq[p] ] + (j - dq[p]) / i;
                t[k][j] = t[1 - k][ dq[p] ];
                if(i <= mid){
                    t[k][j] += j - dq[p];
                }
            }
        }
        k = 1 - k;
    }
    if(st == 1 && dr == 200){
        for(i = g; i >= 1; i--){
            if(d[1 - k][i] != 100000000){
                fout<< i <<" "<< d[1 - k][i] <<"\n";
                int a = t[1 - k][i];
                solve(a, 1, mid);
                solve(i - a, mid + 1, 200);
                break;
            }
        }
    }
    else{
        int a = t[1 - k][g];
        solve(a, st, mid);
        solve(g - a, mid + 1, dr);
    }
}
int main(){
    fin>> n >> g;
    for(i = 1; i <= n; i++){
        fin>> x;
        ff[x]++;
    }
    solve(g, 1, 200);
    return 0;
}